說說 Redis 緩存刪除策略

Redis 緩存刪除策略分爲定時刪除、定期刪除與惰性刪除。前兩個是主動刪除,後一個是被動刪除。

1 定時刪除

爲 key 設置一個過期時間,時間一到,由定時器任務刪除這個 key。

優點:節省內存,因爲 key 一過期,就會被立即刪除。

缺點:CPU壓力大,因此相當於 CPU 在輪詢判斷當前時間是否需要執行刪除任務。

2 惰性刪除

key 過期時不處理,直到訪問該 key 時才刪除。(很懶,直到最後一刻才執行)

優點:節省 CPU 資源,因爲直到訪問該 key 時,纔用到 CPU。

缺點:key 過期後,仍然佔用內存空間,可能導致內存出現大量過期的 key。

3 定期刪除

相當於前兩種策略的折中。

定期刪除是每隔一段時間隨機抽取一些過期 key 執行刪除操作。它限制刪除操作的時長與頻率避免佔用大量 CPU 資源。同時它還刪除那些過期鍵避免佔用大量內存資源1

4 策略失效場景

惰性刪除因爲直到訪問過期 key 時才刪除它,可能導致內存出現大量過期的 key。而定期刪除是一種隨機抽取策略,有些 key 可能一直沒有被抽取到,導致一直駐留在內存中。所以這兩種策略都可能導致 Redis 的內存佔有率越來越高。這時就需要內存淘汰機制來解決這一問題。

5 內存淘汰機制

Redis 有兩種數據集,一種是設置了過期 key 的集合(volatile),另一種是包含所有 key 的集合(allkeys)。它們都擁有以下這些內存淘汰機制2

(1)LRU

LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來淘汰數據,其核心思想是“如果數據最近被訪問過,那麼將來被訪問的機率也更高”3

本質上是把最久未被訪問的元素淘汰掉。

(2)Random

淘汰掉隨機選取的某些元素。

(3)LFU

LFU (Least frequently used) 最不經常使用,如果一個數據在最近一段時間內使用次數很少,那麼在將來一段時間內被使用的可能性也很小4

LFU 是選擇一段時間內使用次數最少的那個元素,而 LRU 是選擇在內存中排在隊尾的那個最近沒有被使用過的元素,因爲如果元素被使用過,那麼會被排在隊頭。


另外還有以下這些機制:

(4)TTL

TTL 是 Time To Live5。當 key 過期,會被馬上清除。

(5)no eviction

不會清除任何 key。當內存超過配置的閾值時,就會拋出錯誤。


參考資料

  1. Redis詳解:Redis過期鍵刪除策略 https://blog.csdn.net/qq_40378034/article/details/89418424
  2. 徹底弄懂Redis的內存淘汰策略 https://zhuanlan.zhihu.com/p/105587132?utm_source=qq
  3. 緩存淘汰算法--LRU算法 https://zhuanlan.zhihu.com/p/34989978
  4. LRU和LFU的區別 https://blog.csdn.net/a3192048/article/details/82291222
  5. Redis中的expire和ttl指令 https://www.cnblogs.com/tubeWang/p/10042334.html
    Redis(6)刪除策略(定時刪除、惰性刪除、定期刪除)和數據逐出策略 https://blog.csdn.net/weixin_43230682/article/details/107670911
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章