實戰Memcached緩存系統(6)Memcached異步實時讀寫問題的解決方案SAC

尊重知識,轉載請註明本文來自:編程藝術家Poechant的CSDN博客 http://blog.csdn.net/poechant

服務器後端開發系列——《實戰Memcached內存緩存系統》》系列博文:http://blog.csdn.net/poechant/article/category/1060687


在使用Memcached時,一般實時讀寫的場景並不多見。但多是Memcached寫入後,在一定時間後纔會有讀操作。但是如果應用場景,是寫入後瞬間即會有讀操作呢?似乎沒有什麼特別之處,我們依然可以這樣寫:


注:此處使用的是spymemcached客戶端。


[java] view plain copy
 print?
  1. MemcachedClient cache = new MemcachedClient(cacheServerAddr);  
  2. cache.set("key"3600, bigData);  
  3. return cache.get("key");  

如此寫入緩存後,如果立刻就有其他客戶端進行讀操作,則會讀取失敗,因爲set是異步操作(async),很可能仍還沒有寫入完。


一種可行的方法,是採用同步寫操作。常用的set方法沒有這種方式,需要採用遵守Memcached的CAS(Check And Set)協議的寫操作。而這種寫操作,一般是基於讀取後得到CAS ID(類似於SVN中的版本ID),根據這個CAS ID來保證寫入時,沒有和其他寫入操作產生“寫重複”衝突。因此,在我們現在所討論的場景中,可以如下使用CAS協議:

(1)初始寫入:寫一個簡單的初始值(set,異步操作);

(2)獲取版本:使用異步方式獲取CAS ID;

(3)同步寫入:以同步方式寫入數據,保證在讀取前,已經寫入結束。

[java] view plain copy
 print?
  1. MemcachedClient cache = new MemcachedClient(cacheServerAddr);  
  2. cache.set(“key”, 3600"");  
  3. long casId = cache.asyncGets("key").get().getCas();  
  4. cache.cas("key", casid, bigData);  
  5. return cache.get("key");  

以這種“Set-Asyncgets-Cas”方式的緩存異步實時讀寫問題的解決方案,我們稱之爲“SAC”(你一定想到了什麼⋯⋯)。


尊重知識,轉載請註明本文來自:編程藝術家Poechant的CSDN博客 http://blog.csdn.net/poechant

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章