1. 程式人生 > >MEMCACHE的記憶體管理和刪除策略

MEMCACHE的記憶體管理和刪除策略

最近在看MEMCACHE的快取機制,發現有些東西不是很明白,追加一篇部落格。

一.記憶體碎片

在不斷的申請和釋放記憶體的時候,實際上會有一些很小的碎片空間沒有使用價值,那麼這就是記憶體碎片(就好像GC在複製-清除的時候,會出現記憶體碎片的不足,是同一個道理)。

二.MEMCACHE的記憶體管理

1.記憶體管理的機制是:slab-allocator:就是說,會將記憶體劃分成多個的slab-class的倉庫,而每個倉庫又含有多個不同大小的chunk。當進行申請記憶體時,會選擇合適大小的chunk。

這裡寫圖片描述

2.如何選擇合適的chunk

通過命令,檢視memcache中的chunk

memcache -vvv

這裡寫圖片描述

現在有114byte記憶體需要存放,首先memcache會檢查chunk組,找到內容大於114byte且兩者差的絕對值最小的那個chunk。如果此時128chunk(即slab class 3 裡面的chunk)已經用完,此時並不會去使用大小為160的chunk,而是將chunk為122裡面的舊資料踢掉,以備使用。

由此可見:固定大小的chunk會帶來記憶體上浪費:我們儲存的是114byte,但是使用的卻是128byte。由於slab allocator機制中,分配的chunk大小事‘固定’的,應此可能會造成記憶體的浪費。對於chunk 空間的浪費問題,無法徹底解決,只能緩解該問題。

3.chunk的增長因子調優

memcache在啟動時,會通過-f選擇指定的Growth Factor因子。可以調節slab-class中的空間大小的差異。預設為1.25

增長因子為1.25
這裡寫圖片描述

備註:當f=1.25 時,從輸出結果來看,某些相鄰的slab class 的大小比值並非為1.25,可能會覺得有些計算誤差,這些誤差是為了保持位元組數的對齊而故意設定的

。(對於其他的增長因子也適用,就好像jvm對物件的記憶體佈局的設定中的對齊填充一樣,使得物件的起始地址是8位元組的整數倍,會將原來8G記憶體擴充套件到32G)。

三.MEMCACHE的過期資料惰性刪除

1.當某個值過期後,並沒有在記憶體刪除,因此status統計時,curr-item有它的資訊。

2.當取值時,判斷是否過期,如果過期,返回空,並且清空值,curr_item就減少了。

3.如果之前沒有get過,將不會自動刪除,當某個新值去佔用它的位置時,當成空的chunk來佔用

即為:這個過期資料,只不過讓使用者看不見,但是沒有在記憶體的角度將其刪除,這就是MEMCACHE的惰性失效。

下圖是在網路中找到的一張截圖:

四.MEMCACHE的刪除機制

刪除機制其實有兩種:

1.LRU刪除機制:least recently used(最近最少使用),當某個單元被請求時,維護一個計數器,通過計數器來判斷最近誰最少被使用。(多用它

2.FIFO刪除機制:first in,first out (最先插入,最先離開)

永久資料被踢現象:即使某個key 是設定的永久有效期,也一樣會被踢出來!

當將物件放入記憶體時,失效資料首先被替換,然後再替換掉最近未使用的資料。