關於memcache實現Mutex模式的解析

2021-06-20 22:48:16 字數 792 閱讀 5634

實施物件:memcache

設計理論:mutex

設計前提:大量併發訪問並存在cache過期。大併發場合,當cache失效導致同時取不到cache,會同一時間訪問db並回設cache,可能會給系統帶來潛在的超負荷風險。

解決方案:

方案一:load db之前add乙個mutex key ,mutex key add 成功再去取db; add 失敗則sleep之後重讀cache。這裡mutex key其實就是鎖,因為memcache是沒有鎖概念,加了鎖就能保證乙個程序去操作對乙個資料物件的db取操作,從而降低了風險。但是為了防止出現死鎖現象,mutex是有時間限制。偽**如下:

if(memcache.get(key)==null)else

}解析: mutex設計理論其實就是乙個防止併發訪問,從而用強加鎖的機制,先搶到鎖的執行緒就直接進行資料處理「db.get-> memcache.set」 ,其餘,就根據mutex_key的狀態進行等待。兩個時間點很重要:一是mutex_key的時間,你需要評估資料從db獲取然後重設到cache週期。比如3分鐘,在3分鐘內,任何memcahce.add操作都會失敗,根據memcache的add的api定義,當前key存在add就會失敗,從而實現了鎖的概念,一旦存在就是加鎖狀態。

第二個時間點是,sleep時間,相對來說,這個時間是執行緒等待然後重新請求的時間,休眠狀態不宜過長。

方案二:相對方案一,將cache做了乙個輔助作用,它不在於memcache.get有value的時候,假設我們需要的cache資料的時間為timeout,那麼我們同時設定乙個timeout1為內部超時時間,其中,timeout1

關於Memcache的連線

addserver 在說memcache的長連線 pconnect 和短連線 connect 之前要先說說memcache的addserver,memcache的addserver是增加乙個伺服器到連線池中 addserver沒有連線到伺服器的動作,所以在memcache程序沒有啟動的時候,執行ad...

memcache 內部原理實現

lazy expiration memcached 內部不會監視記錄是否過期,而是在 get 時檢視記錄的時間戳,檢查記錄是否過期。這 種技術被稱為 lazy 惰性 expiration。因此,memcached 不會在過期監視上耗費 cpu 時間。lru least recently used 最...

memcache 協議 Golang實現

客戶端傳送了乙個不存在的命令client error r n客戶端傳送了乙個不符合協議的命令server error r n服務的錯誤1.noreply r n2.cas noreply r nset 用於將 value 資料值 儲存在指定的 key 鍵 中 如果set的key已經存在,該命令可以更...