Redis緩存淘汰策略
當 redis 內存超出物理內存限制時,內存的數據會開始和磁盤產品頻繁的交換(swap)。這種機制因為涉及到 IO 操作,所以會讓 redis 的性能急劇下降。redis 訪問量本來就十分頻繁,存取效率大幅度降低是很致命的。
在生產環境中我們是不允許 redis 出現 swap 行為的。所以一般會限制最大的使用內存,redis 提供了配置參數maxmemory
來規定最大的使用內存。
以下配置均為合法:
maxmemory 1000KB
maxmemory 100MB
maxmemory 1GB
maxmemory 0 # 表示不做限制,一般不會用
當實際內存超出了 maxmemory 時,redis(5.0.8) 提供了八種淘汰策略(maxmemory-policy)供我們選擇。
- noeviction
寫請求會報錯 (DEL 請求可以繼續服務),讀請求可以繼續進行。這樣可以保證不會丟失數據,但是會讓線上的業務不能持續進行。這是默認的淘汰策略。
- volatile-lru
淘汰范圍:設置了過期時間的 key。(沒有設置過期時間的 key 不會被淘汰,這樣可以保證需要持久化的數據庫不會突然丟失)
淘汰策略:優先刪除最近最少使用的 key。(LRU算法實現:Least recently used,最近最少使用。)
- volatile-lfu
淘汰范圍:設置了過期時間的 key。
淘汰策略:優先刪除使用頻率最少的 key。(LFU算法實現:Least frequently used,最不經常使用。)
- volatile-ttl
淘汰范圍:設置了過期時間的 key。
淘汰策略:優先刪除剩余時間(ttl,time to live)短的 key。
- volatile-random
淘汰范圍:設置了過期時間的 key。
淘汰策略:隨機刪除淘汰范圍內的 key。
- allkeys-lru
淘汰范圍:全體 key。
淘汰策略:優先刪除最近最少使用的 key。(LRU算法實現:Least recently used,最近最少使用。)
- allkeys-lfu
淘汰范圍:全體 key。
淘汰策略:優先刪除使用頻率最少的 key。(LFU算法實現:Least frequently used,最不經常使用。)
- allkeys-random
淘汰范圍:全體 key。
淘汰策略:隨機刪除淘汰范圍內的 key。
- 關於用哪個?
LRU算法淘汰的是最近最少使用的;
LFU算法淘汰的是一直以來使用頻率最少的。
還是得結合業務場景去考慮。
一般還是volatile-lru
會偏多一點吧。
具體配置:
maxmemory-policy volatile-lru