memcache構建簡單的記憶體訊息佇列_PHP教程

來源:互聯網
上載者:User
本文章來給各位同學介紹使用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功...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.