1、Memcached特色:算法
一、協議簡單(基於文本行的協議)。緩存
二、基於libevent的事件處理。服務器
三、內置內存存儲方式。分佈式
四、Memcached不相互通訊的分佈式。ide
注:因爲數據保存在內置的內存存儲空間中,因此重啓memcached會致使所有數據消失。內容容量達到指定值以後,就基於LRU算法自動刪除不使用的緩存。Memcached服務器端沒有分佈式功能,這徹底取決於客戶端的實現。memcached
2、啓動參數:函數
-p 使用端口,默認11211。性能
-m 最大內存大小,默認64M。spa
-vv 用very verbose模式啓動,調試信息和錯誤輸出到控制檯。操作系統
-d 做爲daemon在後臺啓動。
3、Memcached的內存管理機制:
1、默認採用名爲Slab Allocator的分配、管理內存機制。
2、該機制出現前,內存的分配是經過對全部記錄簡單的進行malloc和free來進行的。這種方式會致使內存碎片,加劇操做系統內存管理器的負擔。
3、Slab Allocator基本原理:按照預先規定的大小,將分配的內存分割成各類特定長度的塊,並把尺寸相同的塊分紅組(chunk的集合),以徹底解決內存碎片的問題。
4、Slab Allocator還有重複使用已分配內存的目的,分配的內存不會釋放,而是重複利用。
5、Slab Allocator術語:
Page – 分配給Slab的內存空間,默認是1MB,分配給Slab以後跟據Slab大小切分紅chunk。
Chunk – 用於緩存數據的內存空間。
Slab Class – 特定大小的chunk組。
Memcached根據收到數據的大小,選擇最合適數據大小的Slab,Memcached內會保存slab內空閒chunk的列表。
4、Slab Allocator存在的問題:
因爲分配的是特定長度的內存,所以沒法有效利用分配的內存。
例如:將100字節的數據存入128字節的chunk,則浪費了28字節。
但若是預先知道客戶端發送的數據的公用的大小,或者僅緩存大小相同的數據的狀況下。只要使用適合數據大小的組的列表,就能夠減小浪費。
5、調優:
啓動時指定growth factor因子,就能夠在某種程度上控制slab之間的差別,默認值爲1.25。
Memcached –f 2 –vv
(查看growth factor爲2時slab中chunk size的差別)
Memcached引入時,最好從新計算一下數據的預期平均長度,調整growth factor,以得到最恰當的設置。
6、鏈接Memcached 控制檯:
telnet 主機名端口號
如:telnet localhost 11211
輸入stats回車,查看memcached的狀態。
Memcached 軟件包中Protocol.txt能夠查看協議相關信息。
使用memcached-tool的Perl腳本,能夠方便的得到slab的狀況。
memcached-tool 主機:端口選項
7、數據刪除:
1、Memcached不會釋放已分配的內存,其存儲空間能夠重複使用。
2、Lazy Expiration:
Memcached內部不會監視數據是否過時,而是在get時查看數據的時間戳,查看數據是否過時。被稱爲lazy expiration(惰性過時)。
3、當Memcached內存空間不足,即沒法從slab class中獲取到新的空間時,就從最近未被使用的數據中搜索,將其空間分配給新的數據。(若是要禁用LRU,使用-M參數,超出會報錯)。
4、不指定具體值則默認數值爲64M。
8、其它:
1、二進制協議:使用理由是不須要文本協議的解析處理,使得memcached性能更高。
2、分佈式:將key保存在不一樣的服務器上。
3、性能可達到:請求最大15000qps,流量400Mbps,鏈接數超過10000個,性能很是高。
4、分佈式hash算法:
(1)取模:
求得鍵整數的hash值,除以服務器臺數,所得的餘數決定服務器。
缺點:當添加或者移除服務器時,緩存重組的代價至關巨大,會影響緩存命中率。
(2)Consistent Hashing:
首先求出memcached節點的哈希值,並將其配置到0--2^32的圓上。而後用一樣的方法求出存儲數據的鍵的hash值,並映射到圓上。而後從存儲數據映射的位置順時針查找,將數據保存到找到的第一個服務器上。
Consistent Hashing最大程度的抑制了鍵的從新分佈,只有從增長服務器地點到逆時針相鄰第一臺服務器之間的鍵會受到影響。
有的Consistent Hashing還採用了虛擬節點的思想,使用通常hash函數的話,服務器的映射地點分佈很是不均勻。使用虛擬節點爲每一個服務器在環上分配100--200個點,這樣能抑制分佈不均勻,最大限度的減少服務器增減時緩存從新分佈。