Redis数据过期策略详解
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
?
內存淘汰策略主要采用了6種方式進行內存對象的釋放操作
1.volatile-lru:從設置了過期時間的數據集中,選擇最近最久未使用的數據釋放
2.allkeys-lru:從數據集中(包括設置過期時間以及未設置過期時間的數據集中),選擇最近最久未使用的數據釋放
3.volatile-random:從設置了過期時間的數據集中,隨機選擇一個數據進行釋放
4.allkeys-random:從數據集中(包括了設置過期時間以及未設置過期時間)隨機選擇一個數據進行入釋放
5.volatile-ttl:從設置了過期時間的數據集中,選擇馬上就要過期的數據進行釋放操作
6.noeviction:不刪除任意數據(但redis還會根據引用計數器進行釋放呦~),這時如果內存不夠時,會直接返回錯誤
http://blog.csdn.net/zdy0_2004/article/details/44685615
?
redis只是每個Object維護一個相對的時間,淘汰時,隨機取3個或者更多的,找到最老的進行淘汰.這樣節(jié)省了雙鏈表的指針開銷,讀時還不用加鎖.雖不能保證一定淘汰最老的,但傾向于淘汰偏老的對象, 經過我們線上的實測:和標準的LRU對比,命中率的損失非常小, 效果不錯。
http://blog.csdn.net/wallwind/article/details/44906613
?
Redis的LRU算法不是一個嚴格的LRU實現(xiàn)。這意味著Redis不能選擇最佳候選鍵來回收,也就是最久未被訪問的那些鍵。相反,Redis 會嘗試執(zhí)行一個近似的LRU算法,通過采樣一小部分鍵,然后在采樣鍵中回收最適合(擁有最久訪問時間)的那個。
然而,從Redis3.0開始,算法被改進為維護一個回收候選鍵池。這改善了算法的性能,使得更接近于真實的LRU算法的行為。Redis的LRU算法有一點很重要,你可以調整算法的精度,通過改變每次回收時檢查的采樣數量。
這個參數可以通過如下配置指令:
maxmemory-samples 5
Redis沒有使用真實的LRU實現(xiàn)的原因,是因為這會消耗更多的內存。然而,近似值對使用Redis的應用來說基本上也是等價的。
http://blog.csdn.net/codetomylaw/article/details/50246255
?
惰性刪除+定期刪除
- 惰性刪除流程
- 在進行get或setnx等操作時,先檢查key是否過期,
- 若過期,刪除key,然后執(zhí)行相應操作;
- 若沒過期,直接執(zhí)行相應操作
- 定期刪除流程(簡單而言,對指定個數個庫的每一個庫隨機刪除小于等于指定個數個過期key)
- 遍歷每個數據庫(就是redis.conf中配置的"database"數量,默認為16)
- 檢查當前庫中的指定個數個key(默認是每個庫檢查20個key,注意相當于該循環(huán)執(zhí)行20次,循環(huán)體時下邊的描述)
- 如果當前庫中沒有一個key設置了過期時間,直接執(zhí)行下一個庫的遍歷
- 隨機獲取一個設置了過期時間的key,檢查該key是否過期,如果過期,刪除key
- 判斷定期刪除操作是否已經達到指定時長,若已經達到,直接退出定期刪除。
- 檢查當前庫中的指定個數個key(默認是每個庫檢查20個key,注意相當于該循環(huán)執(zhí)行20次,循環(huán)體時下邊的描述)
- 遍歷每個數據庫(就是redis.conf中配置的"database"數量,默認為16)
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
轉載于:https://my.oschina.net/u/3705388/blog/1618352
總結
以上是生活随笔為你收集整理的Redis数据过期策略详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssh+key
- 下一篇: 【OSS 排查方案-5】透过现象看本质之