本文章來給各位同學介紹使用memcache構建簡單的記憶體訊息佇列,用一個比較不錯的執行個體來給大家介紹,希望此方法對大家有協助哦。
memcache功能太簡單了,只能 set get 和delete, 只能儲存key-value的資料, 不能儲存列表。 當然也可以把一個列表給序列化了之後存進memcache, 但是會存在並發的問題, 每次儲存資料(插隊或者出隊)的時候都要給資料加鎖,在高並發的情況下很難保證資料的一致性!
但是memcache 有一個 increment 的操作,為某一個鍵對應的值進行加1(實際上是加法運算, 預設加1), 這個操作是原子性的, 所以我們可以通過這個來維護一個自增的id來保證資料的唯一。 再加上兩個指標來維護起始索引值, 這樣就構建了一個簡單的但相隊列!!
上代碼:
| 代碼如下 |
複製代碼 |
/**
* memcache構建的簡單記憶體隊列
*
* @author: jeffjing
*/
class memList {
private $memcache; // memcache類
private $queKeyPrefix; //資料鍵首碼
private $startKey; //開始指標鍵
private $startKey; //結束指標鍵
public function __construct($key){
$this->queKeyPrefix = "MEMQUE_{$key}_";
$this->startKey = "MEMQUE_SK_{$key}";
$this->endKey = "MEMQUE_EK_{$key}";
}
/**
* 擷取列表
* 先拿到開始結束指標, 然後去拿資料
*
* @return array
*/
public function getList(){
$startP = $this->memcache->get($this->startKey);
$endP = $this->memcache->get($this->endKey);
empty($startP) && $startP = 0;
empty($endP) && $endP = 0;
$arr = array();
for($i = $startP ; $i < $endP; ++$i) {
$key = $this->queKeyPrefix . $i;
$arr[] = $this->memcache->get($key);
}
return $arr;
}
/**
* 插入隊列
* 結束指標後移,拿到一個自增的id
* 再把值存到指標指定的位置
*
* @return void
*/
public function in($value){
$index = $this->memcache->increment($this->endKey);
$key = $this->queKeyPrefix . $index;
$this->memcache->set($key, $value);
}
/**
* 出隊
* 很簡單, 把開始值取出後開始指標後移
*
* @return mixed
*/
public function out(){
$result = $this->memcache->get($this->startKey);
$this->memcache->increment($this->startKey);
return $result;
}
} |
關於memcached的一些事情
記憶體儲存方式(slab allocator)
memcached的資料存放區方式為slab allocator即資料分區, 在服務啟動的時候先把記憶體分成不同大小的 chunk, 當有資料過來的時候來儲存到一個合適大小的chunk當中
之前版本是直接分配記憶體, 導致記憶體片段 隨機尋找等問題。。。
資料到期刪除機制
memcached在資料到期之後,並不會去刪除資料, 但是不能訪問到期的資料, 到期資料佔用的空間會被重複利用
memcached採用lazy expiration.不會去主動掃描一個資料項目是否到期, 而是在資料get的時候判斷是否已經到期.
刪除的演算法是LRU(Least Recently Used) , 優先刪除最近使用較少的資料
memcached的分布式機制
雖說memcached是一個分布式的緩衝, 但是memcached本身並沒有實現任何分布式的機制, 分布式的功能主要是由用戶端來實現的。
程式通過addserver增加多個memcahced服務到用戶端(memcache擴充), 在存取資料之前,用戶端會先通過hash演算法得到儲存資料的節點, 然後再去存取資料, 當其中一台memcached伺服器掛掉或者新增一台memcached伺服器, hash演算法得到的儲存資料的節點就會變化, 去新的伺服器上去存取資料。
http://www.bkjia.com/PHPjc/632905.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632905.htmlTechArticle本文章來給各位同學介紹使用memcache構建簡單的記憶體訊息佇列,用一個比較不錯的執行個體來給大家介紹,希望此方法對大家有協助哦。 memcache功...