一,理解Memcached的數據存儲方式被稱爲Slab Allocator,其基本方式是:
1,先把內存分成很多個Slab,這個大小是預先規定好的,以解決內存碎片的問題。分配給Slab的內存空間被稱爲Page,默認是1M。一個Slab下可以有多個Page。
2,然後把一個Page分成很多個chunk塊,chunk塊是用於緩存記錄的空間。chunk的大小是先有一個基本值,然後根據增長因子(1.25)來增大。
3,slab class : 內存區類別(48byte-1M) , 每個類別有一個slab classId
4, Memcached 裏面保存着slab內空閒的chunk列表,當收到要保存的item的時候,它會根據item的大小去選擇一個最合適的slab,然後找到空閒的chunk,把數據放進去。
二,新建Item分配內存的過程
1,快速定位slab classId , 先計算Item的長度
key鍵長 + flag + suffix (17字節) + value值長 + 結構大小(32字節) 取最小冗餘的 slab class
2,按順序尋找可用的chunk
(1)slot:檢查slab回收空間slot裏是否有剩餘的chunk
delete:delete時標記到slot
exptime: get時檢查的過期對象標記到slot
(2)end page ptr:檢查page中是否有剩餘的chunk
(3)memory:內存還有剩餘則開闢新的slab
(4)LRU
三,memcached的數據存儲方式的缺點:
由於chunk的大小時預先分配好的特定長度,因此如果數據不能完全填滿chunk,那麼剩餘的空間就浪費了
四,理解Memcached的數據過期方式:
(1)Lazy Expiration(延遲/惰性 過期)
Memcached不會監控記錄是否過期,而是在外部來獲取數據的時候,才檢查記錄時間戳。因此被稱爲Lazy Expiration
(2)LRU(Least Recently Used )
當空間不足的時候,Memcached會優先使用已經過期的數據空間,如果還不夠,那麼就會把最近最少使用的對象的空間釋放出來。 不是全局的,而是針對slab,可以說是區域性的。
(3)懶惰刪除機制
刪除item對象時,不釋放內存,做刪除標記,指針放入slot回收插槽,下次分配的時候直接使用。
要特別注意:Memcached的LRU不是全局的,而是針對slab的,可以說是區域性的