【大廠面試02期】Redis過期key是怎麼樣清理的?
阿新 • • 發佈:2020-06-03
> 【大廠面試02期】Redis過期key是怎麼樣清理的?
在Redis中,對於過期key的清理主要有惰性清除,定時清理,記憶體不夠時清理三種方法,下面我們就來具體看看這三種清理方法。
### (1)惰性清除
在訪問key時,如果發現key已經過期,那麼會將key刪除。
### (2)定時清理
Redis配置項hz定義了serverCron任務的執行週期,預設每次清理時間為25ms,每次清理會依次遍歷所有DB,從db隨機取出20個key,如果過期就刪除,如果其中有5個key過期,那麼就繼續對這個db進行清理,否則開始清理下一個db。
### (3)記憶體不夠時清理
當執行寫入命令時,如果發現記憶體不夠,那麼就會按照配置的淘汰策略清理記憶體,淘汰策略一般有6種,Redis4.0版本後又增加了2種,主要由分為三類
* 第一類 不處理,等報錯(預設的配置)
* noeviction,發現記憶體不夠時,不刪除key,執行寫入命令時直接返回錯誤資訊。(Redis預設的配置就是noeviction)
* 第二類 從所有結果集中的key中挑選,進行淘汰
* allkeys-random 就是從所有的key中隨機挑選key,進行淘汰
* allkeys-lru 就是從所有的key中挑選最近使用時間距離現在最遠的key,進行淘汰
* allkeys-lfu 就是從所有的key中挑選使用頻率最低的key,進行淘汰。(這是Redis 4.0版本後新增的策略)
* 第三類 從設定了過期時間的key中挑選,進行淘汰
這種就是從設定了expires過期時間的結果集中選出一部分key淘汰,挑選的演算法有:
* volatile-random 從設定了過期時間的結果集中隨機挑選key刪除。
* volatile-lru 從設定了過期時間的結果集中挑選上次使用時間距離現在最久的key開始刪除
* volatile-ttl 從設定了過期時間的結果集中挑選可存活時間最短的key開始刪除(也就是從哪些快要過期的key中先刪除)
* volatile-lfu 從過期時間的結果集中選擇使用頻率最低的key開始刪除(這是Redis 4.0版本後新增的策略)
### LRU演算法
LRU演算法的設計原則是如果一個數據近期沒有被訪問到,那麼之後一段時間都不會被訪問到。所以當元素個數達到限制的值時,優先移除距離上次使用時間最久的元素。
可以使用雙向連結串列Node