Memcached是以 LiveJournal 旗下 DangaInteractive 公司的 Brad Fitzpatric 爲首開發的一款高性能的分佈式內存緩存服務器。算法
add('key', 'value' ,'expire')
:key不存在則保存replace('key', 'value', 'expire')
:key存在則保存,會覆蓋舊值set('key', 'value', 'expire')
:直接保存get('key')
get_multi('key')
:獲取多個keydelete('key', 'block time')
:能夠設置指定時間內禁止新增該keyincr('key')
問題背景:內存的分配是經過對全部記錄簡單地進行malloc
和free
來進行,但這種方式致使內存碎片,加劇操做系統內存管理器的負擔。緩存
機制原理:按照預先規定的大小,將分配的內存分割成特定長度的塊,以徹底解決內存碎片問題。服務器
The primary goal of the slabs subsystem in memecached was to eliminate memory fragmentation issues totally by using fixed-size memory chunks coming from a few predetermined size classes.分佈式
如圖所示,Slab Allocation機制即將分配好的內存頁(Page)分割成各類尺寸的塊(Chunk),並把尺寸相同的塊組合成組(Slab Class)。memcached
Memcached會維護着一份Slab中空閒Chunk的列表,當每次存儲數據時,會根據數據大小選擇最合適的組(以減小空間浪費)。性能
但即便使用了列表記錄空閒的塊,仍是沒法作到徹底消除空間的浪費,而最優的方案只能是減小各個塊之間的大小差距,從而可讓緩存的數據恰好選擇一個差異不大的塊進行存儲。而這個調優參數便是 Growth Factor 因子,默認值爲1.25。操作系統
memcached不會釋放已分配的內存,記錄超時後,客戶端就沒法再看見該記錄(invisible,透明),其存儲空間便可重複使用。code
同時,memcached內部不會監視記錄是否過時,而是在get
請求訪問記錄時,檢查記錄的時間戳。該機制稱爲 Lazy Expiration(惰性過時)。cdn
刪除原理:採用 LRU(Least Recently Used)來分配空間。blog
memcached是經過分佈式算法將入參映射到具體的存儲節點,從而實現分佈式存儲。
Memcached原始的分佈式是模運算。
特色:算法簡單、數據分散性優秀
缺點:當機器節點改變時,數據散列受到影響,從而緩存命中率會降低
算法改進:一致性Hash算法
首先求出memcached服務器(節點)的哈希值,並將其配置到 0 ~ 2^32的圓(continuum)上。而後用一樣的方法求出存儲數據的鍵的哈希值,並映射到圓上。而後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。若是超過 2^32 仍然找不到,就會保存到第一臺memcached服務器上。
當往上圖狀態添加一臺服務器時,只有在continuum上增長服務器的地點逆時針方向的第一臺服務器的鍵會受到影響。