1. 程式人生 > >【大廠面試02期】Redis過期key是怎麼樣清理的?

【大廠面試02期】Redis過期key是怎麼樣清理的?

> 【大廠面試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