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。當內存超過配置的閾值時,就會拋出錯誤。
參考資料
- Redis詳解:Redis過期鍵刪除策略 https://blog.csdn.net/qq_40378034/article/details/89418424
- 徹底弄懂Redis的內存淘汰策略 https://zhuanlan.zhihu.com/p/105587132?utm_source=qq
- 緩存淘汰算法--LRU算法 https://zhuanlan.zhihu.com/p/34989978
- LRU和LFU的區別 https://blog.csdn.net/a3192048/article/details/82291222
- Redis中的expire和ttl指令 https://www.cnblogs.com/tubeWang/p/10042334.html
Redis(6)刪除策略(定時刪除、惰性刪除、定期刪除)和數據逐出策略 https://blog.csdn.net/weixin_43230682/article/details/107670911