国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

memcache構建簡單的內存消息隊列

2024-05-04 21:48:27
字體:
來源:轉載
供稿:網友

memcache功能太簡單了,只能 set get 和delete,只能保存key-value的數據,不能保存列表,當然也可以把一個列表給序列化了之后存進memcache,但是會存在并發的問題,每次保存數據,插隊或者出隊的時候都要給數據加鎖,在高并發的情況下很難保證數據的一致性.

但是memcache 有一個 increment 的操作,為某一個鍵對應的值進行加1,實際上是加法運算,默認加1,這個操作是原子性的, 所以我們可以通過這個來維護一個自增的id來保證數據的唯一,再加上兩個指針來維護起始鍵值,這樣就構建了一個簡單的但相隊列.

代碼如下:

  1. <?php 
  2. /** 
  3.  * memcache構建的簡單內存隊列 
  4.  *  
  5.  * @author: jeffjing 
  6.  */ 
  7. class memList { 
  8.  private $memcache; // memcache類 
  9.  
  10.  private $queKeyPrefix; //數據鍵前綴 
  11.  private $startKey; //開始指針鍵 
  12.  private $startKey; //結束指針鍵 
  13.  
  14.  public function __construct($key){ 
  15.   $this->queKeyPrefix = "MEMQUE_{$key}_"
  16.   $this->startKey = "MEMQUE_SK_{$key}"
  17.   $this->endKey = "MEMQUE_EK_{$key}";  
  18.  } 
  19.  
  20.  /** 
  21.   * 獲取列表 
  22.   *  先拿到開始結束指針, 然后去拿數據 
  23.   *  
  24.   * @return array 
  25.   */ 
  26.  public function getList(){ 
  27.   $startP = $this->memcache->get($this->startKey); 
  28.   $endP = $this->memcache->get($this->endKey);   
  29.   empty($startP) && $startP = 0; 
  30.   empty($endP) && $endP = 0; 
  31.  
  32.   $arr = array(); 
  33.   for($i = $startP ; $i < $endP; ++$i) { 
  34.    $key = $this->queKeyPrefix . $i; 
  35.    $arr[] = $this->memcache->get($key); 
  36.   } 
  37.   return $arr; 
  38.  } 
  39.  
  40.  /** 
  41.   * 插入隊列 
  42.   *   結束指針后移,拿到一個自增的id 
  43.   *   再把值存到指針指定的位置 
  44.   *    
  45.   *   @return void 
  46.   */ 
  47.  public function in($value){ 
  48.   $index = $this->memcache->increment($this->endKey); 
  49.   $key = $this->queKeyPrefix . $index; 
  50.   $this->memcache->set($key, $value); 
  51.  } 
  52.  
  53.  /** 
  54.   * 出隊 
  55.   *    很簡單, 把開始值取出后開始指針后移 
  56.   * //開源代碼Vevb.com 
  57.   * @return mixed 
  58.   */ 
  59.  public function out(){ 
  60.   $result = $this->memcache->get($this->startKey); 
  61.   $this->memcache->increment($this->startKey); 
  62.   return $result; 
  63.  } 
  64.  
  65. }  
  66. ?> 

關于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算法得到的存儲數據的節點就會變化,去新的服務器上去存取數據.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兰溪市| 海晏县| 河间市| 平潭县| 和平区| 涟源市| 马关县| 黑山县| 固安县| 红桥区| 娄烦县| 西乌| 怀柔区| 古浪县| 兰西县| 鄂尔多斯市| 兴和县| 石家庄市| 伊宁市| 吉安县| 晋宁县| 临城县| 湟源县| 晋中市| 西青区| 河东区| 本溪市| 景宁| 遵化市| 东丰县| 高淳县| 项城市| 建平县| 河源市| 忻州市| 扶沟县| 大冶市| 永新县| 怀集县| 铜梁县| 凤翔县|