Memcached的數據存儲方式

一,理解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的,可以說是區域性的

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