1昧捷、首先,談一下個人的理解揍堕。清除過期數(shù)據(jù)料身、緩存淘汰策略是兩個方面的意思。
清除過期數(shù)據(jù)有三種策略:分別是定時刪除衩茸、定期刪除芹血、惰性刪除,并且分別基于定時器、hz參數(shù)的定期檢查幔烛、查詢過期key的時間節(jié)點(diǎn)啃擦,作為是否清除數(shù)據(jù)的動作觸發(fā)點(diǎn)。
緩存淘汰策略:是基于redis占用內(nèi)存是否達(dá)到設(shè)定的限制值饿悬,作為是否清除數(shù)據(jù)的動作觸發(fā)點(diǎn)令蛉。
可以說redis,平時基于清除數(shù)據(jù)的策略來清除過期的數(shù)據(jù)狡恬,因?yàn)榍罢哂|發(fā)條件容易滿足珠叔,執(zhí)行的頻率高;而后者要達(dá)到redis設(shè)置的限制值弟劲,需要時間和一系列清除策略的誤差祷安,才會被慢慢放大,最終達(dá)到限制內(nèi)存的臨界點(diǎn)兔乞。試想假定redis的內(nèi)存限制是50G汇鞭,基本不可能在短時間內(nèi)redis內(nèi)存使用率就達(dá)到臨界值。
2庸追、數(shù)據(jù)過期清除策略
- 2.1 定時刪除
每個設(shè)置過期時間的key都需要創(chuàng)建一個定時器霍骄,到過期時間就會立即對key進(jìn)行清除。該策略可以立即清除過期的數(shù)據(jù)淡溯,對內(nèi)存很友好读整;但是會占用大量的CPU資源去處理過期的數(shù)據(jù),從而影響緩存的響應(yīng)時間和吞吐量血筑。 - 2.2 定期刪除
redis會定期執(zhí)行清理過期key的任務(wù)绘沉,運(yùn)行頻率由redis.conf中的hz參數(shù)決定,取值范圍1~500豺总,默認(rèn)是10车伞,代表每秒運(yùn)行10次。
清理過程如下:
1)遍歷所有的db
2)從db中設(shè)置了過期時間的key的集合中隨機(jī)檢查20個key
3)刪除檢查中發(fā)現(xiàn)的所有過期key
4)如果檢查結(jié)果中25%以上的key已過期喻喳,則繼續(xù)重復(fù)執(zhí)行步驟2-3另玖,否則繼續(xù)遍歷下一個db
調(diào)大hz將會提高redis定期任務(wù)的執(zhí)行頻率,如果redis中包含很多過期key的話表伦,可以考慮將這個值調(diào)大谦去,但要注意同時也會增加CPU的壓力,redis作者建議這個值不要超過100蹦哼。
- 2.3 惰性刪除
定期刪除可能導(dǎo)致很多過期的key 到了時間并沒有被刪除掉鳄哭。這時就要使用到惰性刪除。在你獲取某個key的時候纲熏,Redis會檢查一下妆丘,這個key如果設(shè)置了過期時間并且過期了锄俄,是的話就刪除。
3勺拣、緩存淘汰策略
- noeviction:內(nèi)存不足以寫入新數(shù)據(jù)的時候會直接報(bào)錯奶赠。
- allKeys-lru:內(nèi)存不足以寫入新數(shù)據(jù)時候,移除最近最少使用的key药有。
- allKeys-random: 內(nèi)存不足以寫入新數(shù)據(jù)時毅戈,隨機(jī)移除key。
- volatile-lru: 內(nèi)存不足以寫入新數(shù)據(jù)時愤惰,在設(shè)置了過期時間的key當(dāng)中移除最近最少使用的key苇经。
- volatile-random: 內(nèi)存不足以寫入新數(shù)據(jù)時,在設(shè)置了過期時間的key中羊苟,隨即移除key塑陵。
- volatile-ttl: 內(nèi)存不足以寫入新數(shù)據(jù)時感憾,在設(shè)置了過期時間的key當(dāng)中移除最先過期的key蜡励。
通常情況下推薦優(yōu)先使用 allkeys-lru 策略。這樣可以充分利用 LRU 這一經(jīng)典緩存算法的優(yōu)勢阻桅,把最近最常訪問的數(shù)據(jù)留在緩存中凉倚,提升應(yīng)用的訪問性能。
allkeys-lru:有明顯的冷熱數(shù)據(jù)
allkeys-random:無明顯的冷熱數(shù)據(jù)嫂沉。
如果沒有設(shè)置過期時間的鍵值對稽寒,那么 volatile-lru,volatile-lfu趟章,volatile-random 和 volatile-ttl 策略的行為, 和 noeviction 基本上一致杏糙。
相關(guān)配置示范如下:
grep -E 'memory|hz' redis_6385/conf/redis.conf
maxmemory 20gb
maxmemory-policy allkeys-lru
maxmemory-samples 3
hz 50
maxmemory-samples:代表每次隨機(jī)取樣的個數(shù)是3。