redis 過期策略和對象引用

(1) LRU

  • lru記錄的是對象最後一次被命令程序訪問的時間,佔據的比特數不同的版本有所不同(如4.0版本佔24比特,2.6版本佔22比特)。
  • 通過對比lru時間與當前時間,可以計算某個對象的閒置時間;object idletime命令可以顯示該閒置時間(單位是秒)。object idletime命令的一個特殊之處在於它不改變對象的lru值。

在這裏插入圖片描述

	lru值除了通過object idletime命令打印之外,還與Redis的內存回收有關係:如果Redis打開了
maxmemory選項,且內存回收算法選擇的是volatile-lru或allkeys—lru,那麼當Redis內存佔用
超過maxmemory指定的值時,Redis會優先選擇空轉時間最長的對象進行釋放。

(2) refcount

refcount與共享對象

  • refcount記錄的是該對象被引用的次數,類型爲整型。refcount的作用,主要在於對象的引用計數和內存回收。當創建新對象時,refcount初始化爲1;當有新程序使用該對象時,refcount加1;當對象不再被一個新程序使用時,refcount減1;當refcount變爲0時,對象佔用的內存會被釋放。

  • Redis中被多次使用的對象(refcount>1),稱爲共享對象。Redis爲了節省內存,當有一些對象重複出現時,新的程序不會創建新的對象,而是仍然使用原來的對象。這個被重複使用的對象,就是共享對象加粗樣式。目前共享對象僅支持整數值的字符串對象

    共享對象的具體實現:

  • Redis的共享對象目前只支持整數值的字符串對象。之所以如此,實際上是對內存和CPU(時間)的平衡:共享對象雖然會降低內存消耗,但是判斷兩個對象是否相等卻需要消耗額外的時間。對於整數值,判斷操作複雜度爲O(1);對於普通字符串,判斷複雜度爲O(n);而對於哈希、列表、集合和有序集合,判斷的複雜度爲O(n^2)。

  • 雖然共享對象只能是整數值的字符串對象,但是5種類型都可能使用共享對象(如哈希、列表等的元素可以使用)。

  • 就目前的實現來說,Redis服務器在初始化時,會創建10000個字符串對象,值分別是0~9999的整數值;當Redis需要使用值爲0 ~ 9999的字符串對象時,可以直接使用這些共享對象。10000這個數字可以通過調整參數REDIS_SHARED_INTEGERS(4.0中是OBJ_SHARED_INTEGERS)的值進行改變。

  • 共享對象的引用次數可以通過object refcount命令查看,如下圖所示。命令執行的結果頁佐證了只有0~9999之間的整數會作爲共享對象。
    在這裏插入圖片描述

(3) 總結:

  • 綜上所述,redisObject的結構與對象類型、編碼、內存回收、共享對象都有關係;一個redisObject對象的大小爲16字節:

     4bit+4bit+24bit+4Byte+8Byte=16Byte。
    
  • type : 4bit

  • encoding : 4bit

  • lru : 24bit

  • refcount : 4byte

  • ptr : 8byte

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