在高併發場景下,傳統數據庫寫入易成為瓶頸。基於 Memcache 實現的記憶體隊列,能以極低延遲支撐大吞吐量的異步處理需求。本文分享一個生產級的 memcacheQueue 類,支援先進先出(FIFO)、反向讀取、鎖機制防併發衝突等特性。
類內部定義四類鍵前綴,避免鍵名衝突:
HEAD_KEY:隊列頭指標TAIL_KEY:隊列尾指標VALU_KEY:實際數據存儲LOCK_KEY:分布式鎖標識採用整數遞增/遞減模擬隊列指針,currentHead 和 currentTail 分別指向隊首和隊尾,入隊遞增尾指標,出隊遞增頭指標,O(1) 時間複雜度。
_getLock() 利用 Memcache add 命令的原子特性實現分布式鎖,配合 usleep 退避重試,防止緩存擊穿。
add($data)public function add($data) {
if (!$this->_getLock()) return false;
if ($this->_isFull()) { $this->_unLock(); return false; }
$key = $this->queueName . self::VALU_KEY . ($this->currentTail + 1);
$result = memcache_set(self::$client, $key, $data, MEMCACHE_COMPRESSED, $this->expire);
if ($result) $this->_changeTail();
$this->_unLock();
return $result;
}
get($length)支援批量取出並自動刪除,$length > 0 正向讀取,$length < 0 反向讀取:
public function get($length = 0) {
if (!$this->_getLock()) return false;
// ... 構建鍵陣列 ...
$result = @memcache_get(self::$client, $keyArr);
foreach ($keyArr as $v) @memcache_delete(self::$client, $v, 0);
$this->_unLock();
return $result;
}
<?php
$queue = new memcacheQueue('order_queue', 3600, ['host' => '127.0.0.1', 'port' => 11211]);
// 生產者
$queue->add(['order_id' => 1001, 'amount' => 99.9]);
// 消費者
$orders = $queue->get(10); // 批量取 10 條
foreach ($orders as $order) { /* 處理訂單 */ }
?>
$expire 建議設為業務允許的最大延遲,避免數據過期丟失。MAXNUM = 20000 可根據內存調整,防止佔用過多記憶體。$retryNum = 1000 對應理論並發數,高併發場景可適當增大。getQueueLength(),積壓超閾值時觸發擴容或告警。此類封裝了分布式隊列的核心邏輯,適合日誌收集、訂單異步處理、消息推送等場景。實際部署時建議搭配 Memcluster 或 Redis Cluster 實現高可用。