高併發系統常需緩衝佇列 (日誌收集、任務分發、訊息推送)。基於 Memcache 實現的 memcacheQueue 類別提供先進先出 (FIFO)、反向讀取、鎖保護、原子增減、過期自動清理等企業級特性。本文深度解析核心原理與使用範例。
{queueName}_lkkQueueHead_ (頭指標)、{queueName}_lkkQueueTail_ (尾指標)、{queueName}_lkkQueueValu_{index} (資料)、{queueName}_lkkQueueLock_ (分散式鎖)。array_flip 式索引,避免資料搬移。memcache_add 原子性獲取鎖,usleep 重試,防止併發競態。MEMCACHE_COMPRESSED 節省網路/記憶體。| 方法 | 說明 | 回傳 |
|---|---|---|
| __construct($name, $expire=3600, $config) | 初始化連線、鎖、指標 | 物件 |
| add($data) | 尾部推入 (FIFO) | bool |
| get($len=0) | 頭部取出並刪除 (正向 $len>0 / 反向 $len<0) | array/false |
| read($len=0) | 唯讀預覽 (不刪除) | array/false |
| getQueueLength() | 理論長度 (tail-head) | int |
| clear() | 清空佇列 | bool |
| memFlush() | 清空整個 Memcache | void |
$q = new memcacheQueue('task_queue', 3600, ['host'=>'127.0.0.1','port'=>11211]);
// 生產者
for ($i=0; $i<100; $i++) {
$q->add(['id'=>$i, 'action'=>'send_email', 'to'=>"user$i@example.com"]);
}
// 消費者 (批次取出 10 筆處理)
while (($batch = $q->get(10)) !== false) {
foreach ($batch as $task) {
// 處理任務...
echo "處理任務 {$task['id']}\n";
}
// 記得釋放記憶體
unset($batch);
}
// 反向讀取 (最新優先)
$latest = $q->get(-5); // 取最後 5 筆
expire 設太短會導致未消費資料消失;設太長佔用記憶體。依業務 SLA 設定 (如 1 小時)。getQueueLength() 供 Prometheus/Grafana 抓取,設定告警閾值。| 方案 | 優點 | 缺點 |
|---|---|---|
| memcacheQueue | 輕量、無額外中介軟體、PHP 原生 | 單點故障、指標不持久、無 ACK 機制 |
| Redis List (LPUSH/RPOP) | 原子操作、支援阻塞讀取、持久化、集群 | 需額外 Redis 實例 |
| RabbitMQ / Kafka | 企業級可靠性、ACK、死信佇列、流控 | 架構複雜、運維成本高 |
memcacheQueue 以巧妙的指標設計在 Memcache 上實現了高效能佇列,適合中小型專案、已有 Memcache 基礎設施、容忍極低概率資料丟失的場景。核心優勢在於無鎖讀取 (read)、反向讀取、原子鎖保護寫入。生產環境務必加上指標持久化與監控告警。