a.定期刪除+惰性刪除
1.定期刪除
指的是 redis 默認(rèn)是每隔 100ms 就隨機(jī)抽取一些設(shè)置了過期時(shí)間的 key毒费,檢查其是否過期哮独,如果過期就刪除沟饥。
假設(shè) redis 里放了 10w 個(gè) key,都設(shè)置了過期時(shí)間溜嗜,你每隔幾百毫秒向臀,就檢查 10w 個(gè) key巢墅,那 redis 基本上就死了,cpu 負(fù)載會(huì)很高的券膀,消耗在你的檢查過期 key 上了君纫。
注意,這里可不是每隔 100ms 就遍歷所有的設(shè)置過期時(shí)間的 key芹彬,那樣就是一場性能上的災(zāi)難蓄髓。實(shí)際上 redis 是每隔 100ms 隨機(jī)抽取一些 key 來檢查和刪除的。但是問題是舒帮,定期刪除可能會(huì)導(dǎo)致很多過期 key 到了時(shí)間并沒有被刪除掉会喝,那咋整呢?
2.惰性策略
惰性策略就是說玩郊,在你獲取某個(gè) key 的時(shí)候肢执,redis 會(huì)檢查一下 ,這個(gè) key 如果設(shè)置了過期時(shí)間那么是否過期了译红?如果過期了此時(shí)就會(huì)刪除预茄,不會(huì)給你返回任何東西。但是實(shí)際上這還是有問題的侦厚,如果定期刪除漏掉了很多過期 key耻陕,然后你也沒及時(shí)去查,也就沒走惰性刪除刨沦,此時(shí)會(huì)怎么樣诗宣?
b.內(nèi)存淘汰機(jī)制
volatile-lru
對(duì)于設(shè)置了過期時(shí)間的記錄根據(jù)lru(latest recently used)的方法進(jìn)行刪除,不推薦想诅。
allkeys-lru
對(duì)于所有記錄使用lru規(guī)則進(jìn)行刪除召庞,推薦。
volatile-random
對(duì)于設(shè)置了過期時(shí)間的記錄隨機(jī)刪除侧蘸,不推薦裁眯。
allkeys-random
對(duì)于所有記錄隨機(jī)刪除,不推薦讳癌。
volatile-ttl
對(duì)于設(shè)置了過期時(shí)間的記錄,刪除離當(dāng)前時(shí)間最近的記錄存皂,不推薦晌坤。
noeviction
不刪除記錄逢艘,也就是當(dāng)達(dá)到內(nèi)存最大值的時(shí)候,再來新記錄直接報(bào)錯(cuò)骤菠。這事redis的默認(rèn)過期策略它改,不推薦。
從對(duì)redis的過期策略分析來看我們很明顯應(yīng)該使用allkeys-lru來作為我們的過期策略商乎。