當前位置:成語大全網 - 新華字典 - Redis 過期策略 和 回收策略

Redis 過期策略 和 回收策略

惰性策略就是在客戶端訪問這個 key 的時候,redis 對 key 的過期時間進行檢查,如果過期了就立即刪除。

Redis 默認會每秒進行十次過期掃描,過期掃描不會遍歷過期字典中所有的 key,而是采用了壹種簡單的貪心策略。

1.從過期字典中隨機 20 個 key;

2.刪除這 20 個 key 中已經過期的 key;

3.如果過期的 key 比率超過 1/4,那就重復步驟 1;

同時,為了保證過期掃描不會出現循環過度,導致線程卡死現象,算法還增加了掃描時間的上限,默認不會超過 25ms。

從庫不會進行過期掃描,從庫對過期的處理是被動的。主庫在 key 到期時,會在 AOF 文件裏增加壹條 del 指令,同步到所有的從庫,從庫通過執行這條 del 指令來刪除過期的 key。

因為指令同步是異步進行的,所以主庫過期的 key 的 del 指令沒有及時同步到從庫的話,會出現主從數據的不壹致

這是由 redis 的過期策略來決定。

redis 過期策略是: 定期刪除+惰性刪除 。

所謂定期刪除,指的是 redis 默認是每隔 100ms 就隨機抽取壹些設置了過期時間的 key,檢查其是否過期,如果過期就刪除。

假設 redis 裏放了 10w 個 key,都設置了過期時間,妳每隔幾百毫秒,就檢查 10w 個 key,那 redis 基本上就死了,cpu 負載會很高的,消耗在妳的檢查過期 key 上了。註意,這裏可不是每隔 100ms 就遍歷所有的設置過期時間的 key,那樣就是壹場性能上的災難。實際上 redis 是每隔 100ms 隨機抽取壹些 key 來檢查和刪除的。

但是問題是,定期刪除可能會導致很多過期 key 到了時間並沒有被刪除掉,那咋整呢?所以就是惰性刪除了。這就是說,在妳獲取某個 key 的時候,redis 會檢查壹下 ,這個 key 如果設置了過期時間那麽是否過期了?如果過期了此時就會刪除,不會給妳返回任何東西。

但是實際上這還是有問題的,如果定期刪除漏掉了很多過期 key,然後妳也沒及時去查,也就沒走惰性刪除,此時會怎麽樣?如果大量過期 key 堆積在內存裏,導致 redis 內存塊耗盡了,咋整?

答案是:走內存淘汰機制。