過(guò)期策略
- 定時(shí)過(guò)期(主動(dòng)淘汰),
- Redis未使用
- 每個(gè)設(shè)置過(guò)期時(shí)間的key都需要?jiǎng)?chuàng)建一個(gè)定時(shí)器,到過(guò)期時(shí)間就會(huì)立即清除
- 可以立即清除過(guò)期的數(shù)據(jù),對(duì)內(nèi)存很友好
- 但是會(huì)占用大量的CPU資源去處理過(guò)期的數(shù)據(jù),影響緩存的響應(yīng)時(shí)間和吞吐量
-
惰性過(guò)期(被動(dòng)淘汰)
- 只有當(dāng)訪問(wèn)一個(gè)key時(shí),才會(huì)判斷該key是否已過(guò)期蝙泼,過(guò)期則清除
- 可以最大化地節(jié)省CPU資源,卻對(duì)內(nèi)存非常不友好劝枣,極端情況可能有大量過(guò)期key沒(méi)有再次被訪問(wèn)汤踏,從而不會(huì)被清除,占用大量?jī)?nèi)存
-
定期過(guò)期
- 每隔一定時(shí)間舔腾,會(huì)掃描一定數(shù)量的數(shù)據(jù)庫(kù)的expires字典中一定數(shù)量的key溪胶,并清除其中已過(guò)期的key
- 該策略是前兩者的一個(gè)折中方案。通過(guò)調(diào)整定時(shí)掃描的時(shí)間間隔和每次掃描的限定耗時(shí)稳诚,可以在不同情況下使得CPU和內(nèi)存資源達(dá)到最優(yōu)的平衡效果
Redis 中同時(shí)使用了惰性過(guò)期和定期過(guò)期兩種過(guò)期策略
Redis中定期過(guò)期策略算法大致實(shí)現(xiàn)
- redis.config中hz定義了serverCron任務(wù)的執(zhí)行周期哗脖,默認(rèn)為10,即CPU空閑時(shí)每秒執(zhí)行10次
- 每次過(guò)期key清理的時(shí)間不超過(guò)CPU時(shí)間的25%,即若hz=1才避,則一次清理時(shí)間最大為250ms橱夭,若hz=10,則一次清理時(shí)間最大為25ms
- 清理時(shí)依次遍歷所有的db
- 從db中隨機(jī)取20個(gè)key桑逝,判斷是否過(guò)期棘劣,若過(guò)期,則逐出
- 若有5個(gè)以上key過(guò)期楞遏,則重復(fù)步驟4茬暇,否則遍歷下一個(gè)db
- 在清理過(guò)程中,若達(dá)到了25%CPU時(shí)間寡喝,退出清理過(guò)程
淘汰策略
淘汰策略 | 含義 |
---|---|
volatile-lru | 根據(jù) LRU 算法刪除設(shè)置了超時(shí)屬性(expire)的鍵糙俗,直到騰出足夠內(nèi)存為止。如果沒(méi)有可刪除的鍵對(duì)象预鬓,回退到 noeviction 策略巧骚。 |
allkeys-lru | 根據(jù) LRU 算法刪除鍵,不管數(shù)據(jù)有沒(méi)有設(shè)置超時(shí)屬性珊皿,直到騰出足夠內(nèi)存為止网缝。 |
volatile-lfu | 在帶有過(guò)期時(shí)間的鍵中選擇最不常用的。 |
allkeys-lfu | 在所有的鍵中選擇最不常用的蟋定,不管數(shù)據(jù)有沒(méi)有設(shè)置超時(shí)屬性。 |
volatile-random | 在帶有過(guò)期時(shí)間的鍵中隨機(jī)選擇草添。 |
allkeys-random | 隨機(jī)刪除所有鍵驶兜,直到騰出足夠內(nèi)存為止。 |
volatile-ttl | 根據(jù)鍵值對(duì)象的 ttl 屬性远寸,刪除最近將要過(guò)期數(shù)據(jù)抄淑。如果沒(méi)有,回退到 noeviction 策略驰后。 |
noeviction | 默認(rèn)策略肆资,不會(huì)刪除任何數(shù)據(jù),拒絕所有寫(xiě)入操作并返回客戶端錯(cuò)誤信息(error)OOMcommand not allowed when used memory灶芝,此時(shí) Redis 只響應(yīng)讀操作 |
建議使用 volatile-lru郑原,在保證正常服務(wù)的情況下,優(yōu)先刪除最近最少使用的 key
在 redis.conf 中
# maxmemory-policy noeviction
配置淘汰策略