首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 基於 Memcache 實現高併發隊列類:AB面輪換、鎖機制、入隊出隊

     編輯:PHP 相關知識

設計思路

  • 雙緩衝區(Side A/B)輪換,寫滿一切換,讀取時優先消費舊面。
  • Memcache 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);

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved