memcached學習筆記

簡介

memcached是一種分佈式內存緩存系統,用於減輕數據庫的壓力。memcached集羣本身不具備分佈式的特性,集羣內的機器之間相互獨立,它需要客戶端的有力配合來完成數據的路由。數據分佈在memcache集羣中,當客戶端需要查詢某個key對應的value時,客戶端首先通過某種算法(取模或者一致性hash等)確定所在的節點,然後通過節點內的hash算法找到真正的值。


memcached客戶端決定了數據分佈,所以選用恰當的客戶端比較重要,比較常用的java客戶端有xmemcached、memcached client等,memcached採用的緩存機制是LRU和失效時間相結合,當內存不夠用時,會優先淘汰過期的數據和最近未使用的數據。


內存模型

採用malloc/free的方式來管理內存,會存在大量的內存碎片,導致操作系統花在碎片整理上的時間越來越多,影響memcached進程的運行。memcached爲了解決內存碎片,內存分配採用的是slab分配器,memcached從操作系統申請內存空間後,將這些內存空間切分成不同大小的chunk。從slab分配內存時,選擇大於等於所需內存的最小chunk。



如果大小爲144k的slab class沒有剩餘空間了,會先採用過期機制淘汰過期的塊,如果沒有過期的塊,會採用LRU(least recently used )算法踢掉最近最少使用的chunk。

將144k的chunk分配給120k的value使用,造成了內存空間浪費,memcached在這個問題上並沒有提出完美的解決方案,可以設置合適的Growth Factor(增長因子)來緩解這種浪費。

通過set方法存取kv對時,可以設置過期時間,在到達過期時間後,memcached並沒有將過期的數據設置爲空,而且採用get時判斷的方式,即get時比較當前時間與過期時間,如果在過期時間之後則get返回空數據。


副本機制與容錯能力

一般的NOSQL框架都有副本機制,memcached卻沒有采用副本機制,也就是說同一個key最多隻存在一臺機器上,這和memcached的設計理念有關,設計的初衷是用在有數據源的情況下,即它把DB當成天然的副本。

在節點失效或者由於機器上下線調整,所對應的key可能不在對應機器上時,memcached並沒有做特殊處理,而是建議從DB中重新獲取,訪問DB的次數過多會加重DB的負擔,可以增加機器數降低DB的訪問次數,也可以採用熱備機制來保護DB。

在採用memcached緩存數據時,由於它沒有副本機制,要防止數據批量失效的情況發生。即使有這樣的業務需求,在失效時也要有個緩衝機制在裏面,即把定時失效調整爲一段時間失效。


客戶端算法

取模:命中率在節點增加或者減少的情況下急劇下降,一般不採用這種方式;

一致性hash+虛擬節點:可以把down機後的節點的數據請求平均地分散到多個節點。


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