Redis數據過時策略詳解

 

內存淘汰策略主要採用了6種方式進行內存對象的釋放操做html

1.volatile-lru:從設置了過時時間的數據集中,選擇最近最久未使用的數據釋放java

2.allkeys-lru:從數據集中(包括設置過時時間以及未設置過時時間的數據集中),選擇最近最久未使用的數據釋放redis

3.volatile-random:從設置了過時時間的數據集中,隨機選擇一個數據進行釋放算法

4.allkeys-random:從數據集中(包括了設置過時時間以及未設置過時時間)隨機選擇一個數據進行入釋放數據庫

5.volatile-ttl:從設置了過時時間的數據集中,選擇立刻就要過時的數據進行釋放操做dom

6.noeviction:不刪除任意數據(但redis還會根據引用計數器進行釋放呦~),這時若是內存不夠時,會直接返回錯誤性能

http://blog.csdn.net/zdy0_2004/article/details/44685615.net

 

redis只是每一個Object維護一個相對的時間,淘汰時,隨機取3個或者更多的,找到最老的進行淘汰.這樣節省了雙鏈表的指針開銷,讀時還不用加鎖.雖不能保證必定淘汰最老的,但傾向於淘汰偏老的對象, 通過咱們線上的實測:和標準的LRU對比,命中率的損失很是小, 效果不錯。指針

http://blog.csdn.net/wallwind/article/details/44906613code

 

Redis的LRU算法不是一個嚴格的LRU實現。這意味着Redis不能選擇最佳候選鍵來回收,也就是最久未被訪問的那些鍵。相反,Redis 會嘗試執行一個近似的LRU算法,經過採樣一小部分鍵,而後在採樣鍵中回收最適合(擁有最久訪問時間)的那個。

然而,從Redis3.0開始,算法被改進爲維護一個回收候選鍵池。這改善了算法的性能,使得更接近於真實的LRU算法的行爲。Redis的LRU算法有一點很重要,你能夠調整算法的精度,經過改變每次回收時檢查的採樣數量。

這個參數能夠經過以下配置指令:

maxmemory-samples 5

Redis沒有使用真實的LRU實現的緣由,是由於這會消耗更多的內存。然而,近似值對使用Redis的應用來講基本上也是等價的。

http://blog.csdn.net/codetomylaw/article/details/50246255

 

惰性刪除+按期刪除

  • 惰性刪除流程
    • 在進行get或setnx等操做時,先檢查key是否過時,
    • 若過時,刪除key,而後執行相應操做;
    • 若沒過時,直接執行相應操做
  • 按期刪除流程(簡單而言,對指定個數個庫的每個庫隨機刪除小於等於指定個數個過時key)
    • 遍歷每一個數據庫(就是redis.conf中配置的"database"數量,默認爲16)
      • 檢查當前庫中的指定個數個key(默認是每一個庫檢查20個key,注意至關於該循環執行20次,循環體時下邊的描述)
        • 若是當前庫中沒有一個key設置了過時時間,直接執行下一個庫的遍歷
        • 隨機獲取一個設置了過時時間的key,檢查該key是否過時,若是過時,刪除key
        • 判判定期刪除操做是否已經達到指定時長,若已經達到,直接退出按期刪除。

http://www.cnblogs.com/java-zhao/p/5205771.html

http://www.cnblogs.com/xuliangxing/p/7151812.html

 

redis 4.0引入LFU,要配置LFU模式,如下策略是可用的:

  • volatile-lfu:使用LFU算法驅逐keys,在過時的keys中驅逐。
  • allKeys-lfu:使用LFU算法驅逐keys。

http://blog.csdn.net/iycynna_123/article/details/72628272

 

http://blog.csdn.net/qq_35440678/article/details/53453107

相關文章
相關標籤/搜索