add 實現分佈式鎖,increment 維護頭尾指針。<?php
class memcacheQueue {
public static $client; // Memcache 連接
public $access; // 鎖狀態
private $currentSide, $lastSide; // 當前/上一輪面
private $sideAHead, $sideATail, $sideBHead, $sideBTail;
private $currentHead, $currentTail, $lastHead, $lastTail;
private $expire = 3600; // 過期時間
private $sleepTime = 1000; // 等待鎖微秒
private $queueName; // 隊列名
private $retryNum = 10000; // 重試次數
const MAXNUM = 2000; // 單面最大長度
const HEAD_KEY = '_lkkQueueHead_';
const TAIL_KEY = '_lkkQueueTail_';
const VALU_KEY = '_lkkQueueValu_';
const LOCK_KEY = '_lkkQueueLock_';
const SIDE_KEY = '_lkkQueueSide_';
public function __construct($queueName, $expire='', $config='') { /* 連接初始化、鎖鍵初始化、讀取頭尾指針 */ }
private function getHeadNTail($name) { /* 從 Memcache 讀取四個指針 */ }
public function getCurrentSide() { /* 獲取當前輪面,設置頭尾指針引用 */ }
private function getLock() { /* add 鎖鍵,失敗 usleep 重試 */ }
private function unLock() { /* delete 鎖鍵 */ }
public function add($data) { /* 加鎖、檢查是否滿、寫入值鍵、遞增尾指針、滿則切面遞歸 */ }
public function get($length=0) { /* 加鎖、構建鍵數組、mget 取值、刪除鍵、更新頭指針、解鎖 */ }
public function read($length=0) { /* 僅讀不刪,構建鍵數組 mget */ }
private function getKeyArray($length) { /* 先取上一面,再取當前面,返回鍵列表 */ }
private function changeTail() { /* increment 尾指針 */ }
private function changeHead($side, $headValue) { /* 更新頭指針,若超過尾則重置該面 */ }
private function resetSide($side) { /* 頭尾歸零 */ }
private function changeCurrentSide() { /* 切換 SIDE_KEY 值 A<->B */ }
public function isFull() { return $this->sideATail==self::MAXNUM && $this->sideBTail==self::MAXNUM; }
public function isEmpty() { return $this->sideATail==0 && $this->sideBTail==0; }
public function getQueueLength() { return ($this->sideATail-$this->sideAHead)+($this->sideBTail-$this->sideBHead); }
public function clear() { /* 加鎖、刪除所有值鍵、重置頭尾、解鎖 */ }
public function memFlush() { memcache_flush(self::$client); }
}
?>
使用示例:$q = new memcacheQueue('my_queue'); $q->add('task1'); $data = $q->get(10);