a.定期刪除+惰性刪除
1.定期刪除
指的是 redis 默認(rèn)是每隔 100ms 就隨機(jī)抽取一些設(shè)置了過期時間的 key,檢查其是否過期,如果過期就刪除。
假設(shè) redis 里放了 10w 個 key,都設(shè)置了過期時間,你每隔幾百毫秒,就檢查 10w 個 key,那 redis 基本上就死了,cpu 負(fù)載會很高的,消耗在你的檢查過期 key 上了。
注意,這里可不是每隔 100ms 就遍歷所有的設(shè)置過期時間的 key,那樣就是一場性能上的災(zāi)難。實際上 redis 是每隔 100ms 隨機(jī)抽取一些 key 來檢查和刪除的。但是問題是,定期刪除可能會導(dǎo)致很多過期 key 到了時間并沒有被刪除掉,那咋整呢?
2.惰性策略
惰性策略就是說,在你獲取某個 key 的時候,redis 會檢查一下 ,這個 key 如果設(shè)置了過期時間那么是否過期了?如果過期了此時就會刪除,不會給你返回任何東西。但是實際上這還是有問題的,如果定期刪除漏掉了很多過期 key,然后你也沒及時去查,也就沒走惰性刪除,此時會怎么樣?
b.內(nèi)存淘汰機(jī)制
volatile-lru
對于設(shè)置了過期時間的記錄根據(jù)lru(latest recently used)的方法進(jìn)行刪除,不推薦。
allkeys-lru
對于所有記錄使用lru規(guī)則進(jìn)行刪除,推薦。
volatile-random
對于設(shè)置了過期時間的記錄隨機(jī)刪除,不推薦。
allkeys-random
對于所有記錄隨機(jī)刪除,不推薦。
volatile-ttl
對于設(shè)置了過期時間的記錄,刪除離當(dāng)前時間最近的記錄,不推薦。
noeviction
不刪除記錄,也就是當(dāng)達(dá)到內(nèi)存最大值的時候,再來新記錄直接報錯。這事redis的默認(rèn)過期策略,不推薦。
從對redis的過期策略分析來看我們很明顯應(yīng)該使用allkeys-lru來作為我們的過期策略。