Redis的 過期策略 和 淘汰策略

過期策略

  • 定時(shí)過期(主動(dòng)淘汰),
    • Redis未使用
    • 每個(gè)設(shè)置過期時(shí)間的key都需要?jiǎng)?chuàng)建一個(gè)定時(shí)器,到過期時(shí)間就會(huì)立即清除
    • 可以立即清除過期的數(shù)據(jù),對(duì)內(nèi)存很友好
    • 但是會(huì)占用大量的CPU資源去處理過期的數(shù)據(jù),影響緩存的響應(yīng)時(shí)間和吞吐量
  • 惰性過期(被動(dòng)淘汰)
    • 只有當(dāng)訪問一個(gè)key時(shí),才會(huì)判斷該key是否已過期,過期則清除
    • 可以最大化地節(jié)省CPU資源,卻對(duì)內(nèi)存非常不友好,極端情況可能有大量過期key沒有再次被訪問,從而不會(huì)被清除,占用大量內(nèi)存
  • 定期過期
    • 每隔一定時(shí)間,會(huì)掃描一定數(shù)量的數(shù)據(jù)庫的expires字典中一定數(shù)量的key,并清除其中已過期的key
    • 該策略是前兩者的一個(gè)折中方案。通過調(diào)整定時(shí)掃描的時(shí)間間隔和每次掃描的限定耗時(shí),可以在不同情況下使得CPU和內(nèi)存資源達(dá)到最優(yōu)的平衡效果

Redis 中同時(shí)使用了惰性過期和定期過期兩種過期策略

Redis中定期過期策略算法大致實(shí)現(xiàn)

  1. redis.config中hz定義了serverCron任務(wù)的執(zhí)行周期,默認(rèn)為10,即CPU空閑時(shí)每秒執(zhí)行10次
  2. 每次過期key清理的時(shí)間不超過CPU時(shí)間的25%,即若hz=1,則一次清理時(shí)間最大為250ms,若hz=10,則一次清理時(shí)間最大為25ms
  3. 清理時(shí)依次遍歷所有的db
  4. 從db中隨機(jī)取20個(gè)key,判斷是否過期,若過期,則逐出
  5. 若有5個(gè)以上key過期,則重復(fù)步驟4,否則遍歷下一個(gè)db
  6. 在清理過程中,若達(dá)到了25%CPU時(shí)間,退出清理過程

淘汰策略

淘汰策略 含義
volatile-lru 根據(jù) LRU 算法刪除設(shè)置了超時(shí)屬性(expire)的鍵,直到騰出足夠內(nèi)存為止。如果沒有可刪除的鍵對(duì)象,回退到 noeviction 策略。
allkeys-lru 根據(jù) LRU 算法刪除鍵,不管數(shù)據(jù)有沒有設(shè)置超時(shí)屬性,直到騰出足夠內(nèi)存為止。
volatile-lfu 在帶有過期時(shí)間的鍵中選擇最不常用的。
allkeys-lfu 在所有的鍵中選擇最不常用的,不管數(shù)據(jù)有沒有設(shè)置超時(shí)屬性。
volatile-random 在帶有過期時(shí)間的鍵中隨機(jī)選擇。
allkeys-random 隨機(jī)刪除所有鍵,直到騰出足夠內(nèi)存為止。
volatile-ttl 根據(jù)鍵值對(duì)象的 ttl 屬性,刪除最近將要過期數(shù)據(jù)。如果沒有,回退到 noeviction 策略。
noeviction 默認(rèn)策略,不會(huì)刪除任何數(shù)據(jù),拒絕所有寫入操作并返回客戶端錯(cuò)誤信息(error)OOMcommand not allowed when used memory,此時(shí) Redis 只響應(yīng)讀操作

建議使用 volatile-lru,在保證正常服務(wù)的情況下,優(yōu)先刪除最近最少使用的 key

在 redis.conf 中 # maxmemory-policy noeviction 配置淘汰策略

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容