PHP實現的memcache環形佇列類例項

2022-10-06 10:12:11 字數 3574 閱讀 1370

這裡介紹了php實現的memcache環形佇列類。沒咋學過資料結構,因為業務需要,所以只是硬著頭皮模擬的! 參考php memcache 佇列**。為使佇列隨時可入可出,且不受int長度越界危險(單鏈採取head自增的話不作處理有越界可能),所以索性改寫成環形佇列。可能還有bug,忘見諒!

<?php /**

* php memcache 環形佇列類

* 原作者 lkk/lianq.net

* 修改 foxhunter

* 因業務需要只保留的佇列中的pop和push,修改過期時間為0即永久

*/class mqueue

elseif (is_array($config)) elseif (is_string($config))

if (!self::$client)

return false;

ignore_user_abort(true); //當客戶斷開連線,允許繼續執行

set_time_limit(0); //取消指令碼執行延時上限

$this->access = false;

$this->sleeptime = 1000;

$expire = (empty($expire)) ? 0 : (int) $expire + 1;

$this->expire = $expire;

$this->queuename = $queuename;

$this->retrynum = 20000;

$this->maxnum = $maxqueue != null ? $maxqueue : 1;

$this->canrewrite = $canrewrite;

$this->getheadandtail();

if (!isset($this->head) || empty($this->head))

$this->head = 0;

if (!isset($this->tail) || empty($this->tail))

$this->tail = 0;

if (!isset($this->len) || empty($this->len))

$this->len = 0;

} //獲取佇列首尾指標資訊和長度

private function getheadandtail()

// 利用memcache_add原子性加鎖

private function lock()

}return $this->access = true;

} return false;

} //更新頭部指標指向,指向下乙個位置

private function incrhead()

;$this->len--; //head的移動由pop觸發,所以相當於數量減少

if ($this->len < 0)

; memcache_set(self::$client, $this->queuename . self::head_key, $this->head, false, $this->expire); //更新

memcache_set(self::$client, $this->queuename . self::length_key, $this->len, false, $this->expire); //更新

} //更新尾部指標指向,指向下乙個位置

private function incrtail()

;$this->len++; //head的移動由push觸發,所以相當於數量增加

if ($this->len >= $this->maxnum)

; memcache_set(self::$client, kcykuhqk$this->queuename . self::tail_key, $this->tail, false, $this->expire); //更新

memcache_set(self::$client, $this->queuename . self::length_key, $this->len, false, $this->expire); //更新

} // 解鎖

private func程式設計客棧tion unlock()

//判斷是否滿佇列

public functi isfull()

//判斷是否為空

public function isempty()

public function getlen()

/** push值

* @param mixed 值

* @return bool

*/public function push($data = '')

$this->getheadandtail(); //獲取最新指標資訊

if ($this->isfull())

if (memcache_set(self::$client, $this->queuename . self::valu_key . $this->tail, $data, memcache_compressed, $this->expire))

$this->incrtail(); //移動尾部指標

$result = true;

} $this->unlock();

return $result;

} /*

* pop乙個值

* @param [length] int 佇列長度

* @return array

*/public function pop($length = 0)

//獲取長度超出佇列長度後進行修正

if ($length > $this->len)

$length = $this->len;

$data = $this->popkeyarray($length);

$this->unlock();

return $data;

} /*

* pop某段長度的值

* @param [length] int 佇列長度

* @return array

*/private function popkeyarray($length)

else

} return $result;

} /*

* 重置佇列

* * @return null

*/private function reset($all = false)

else

} /*

* 清除所有memcache快取資料

* @return null

*/public function memflush()

public function clear($all = false)

@memcache_delete(self::$client, $this->queuename . self::valu_key . $curr, 0);

} $this->unlock();

$this->reset($all);

return true;

}}本文標題: php實現的memcache環形佇列類例項

本文位址:

通過memcache實現php的session共享

基礎環境 目前lvs負載均衡集群已經部署完畢,但是因為web伺服器的會話不一致導致電商 出現無法正常註冊賬號,無法正常結算等等問題!現在我們需要在後端安裝一台memcached伺服器用來儲存session,達到session共享,實現session一致的目的.yum y install memcac...

PHP實現約瑟夫環

題目 有17個人圍成一圈 編號0 16 從第0號的人開始從1報數,凡報到3的倍數的人離開圈子,然後再數下去,直到最後只剩下乙個人為止,問此人原來的位置是多少號?思想 1.設定陣列,把這些人按照編號存入陣列,且加乙個標記位,0代表沒有被移出,1代表移出。2.執行無限迴圈,在每一次迴圈中,對整個陣列進行...

PHP實現的memcache環形佇列類例項

這篇文章主要介紹了php實現的memcache環形佇列類,例項分析了基於memcache實現環形佇列的方法,涉及memcache快取及佇列的相關技巧,需要的朋友可以參考下 這裡介紹了php實現的memcache環形佇列類。沒咋學過資料結構,因為業務需要,所以只是硬著頭皮模擬的!參考php memca...