memcache簡要學習

最近在使用memcache,通過網上文檔及公司的文檔,對memcache進行了簡要學習。

memcache是啥:

一句話:就是緩存。任何訪問後端(如mysql等)的內容,返回結果都可存儲在memcache中(按照key-value),下次同樣key請求時,直接訪問memcache,獲取結果。好處是:一是降低後端壓力,二是提高響應速度;

安裝:

不多講。網上內容超級多,tar.gz解壓縮之後,老套路:configure, make, make install。

怎麼用:

./bin/memcached -p 11211 -m 24000 參數很多。-p是端口,即使用哪個端口啓動memcache;-m是分配內存大小,單位是M;其他如:-d 是否是以daemon運行。等等,其他參數,自行使用memcached -help來看

memcache分佈式存儲:

說是分佈式存儲,但是各個server之間,並不會同步數據。即不會進行數據共享。

保存數據方法:

add/replace/set set最NB,不管是否數據,都強求寫入;add是之前有這個數據不寫,沒有的話 ,在寫入;replace是有數據就替換,沒有的話,不進行操作。

內存分配:

最土的方式是頻繁的malloc/free,這種方式會導致嚴重的內存碎片。因此memcache使用了新的機制:slab機制,即按照預先規定的大小,將分配的內存分割成特定長度的塊,完全解決內存碎片問題。同時,slab有重複使用已分配內存的目的,即分配的內存不被釋放。如下圖:

slab1                                                      slab2

chunks chunks

88bytes 88bytes 112bytes    112bytes

88bytes.. 112bytes...

slab3

chunks

144 bytes   144bytes

144bytes...

關於slab機制,首先明確如下概念:

a.      slab class:  會有N個slab class,每個slab class都對外分配固定大小的內存,不同slab class對外分配的內存大小也不一樣。一般初始化的時候,會根據factor確定每個slab class所要分配的內存大小

b.      chunk :  chunk就是如上所述的屬於某個slab class分配出去的固定大小內存。

c.      page: 當一個slab class沒有內存可用時,需要向系統申請想的空間,這時候都是依照一個page的大小來申請的。但一個page用完之後,會繼續申請新的page以便使用。

d.      如果page也不能申請了(有mem_limit限制),則返回空;此時上層應用可能得通過LRU機制,釋放一定空間


Mc(memcache)使用slab機制,也會有一定的問題:雖然內存碎片問題解決了,但是由於分配的內存長度固定,因此無法有效利用分配的內存。例如將110字節的數據,緩存到128字節的chunk中,剩下的18字節就浪費了。。。因此有了調優因子的概念,即-f參數,默認是1.25.

Hash:

程序啓動的時候根據配置創建一定大小的hash數組,記錄該數組長度(比如2^14),每個數組裏面都是一個item的指針。這樣當新插入一個item的時候,過程大致如下:

a.      根據item的key的hash值,hash模上數組大小,即該item所在數組位置

b.      如果該位置爲NULL,表明之前之前沒有item插入,直接插入即可

c.      如果該位置不爲NULL,表明之前有item已經插入,則遍歷該item的單向鏈表,直到最後,插在鏈表最後面

d.      如果現在總的item個數大於數組大小的1.5,則嘗試擴展hash表




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