1. 為什么需要內存淘汰策略?
Redis 是一個基于內存的高性能數據庫,所有數據都存儲在內存中。
優點:讀寫速度極快。
缺點:內存有限,存滿之后如果繼續寫入,就必須有一套策略來決定“刪掉誰,留下誰”。
這就是 內存淘汰策略(Eviction Policy)。
配置參數:
maxmemory <bytes> # 限制 Redis 使用的最大內存
maxmemory-policy <policy> # 設置淘汰策略
2. Redis 內存淘汰策略分類
Redis 提供了 8 種內存淘汰策略(6 個淘汰策略 + 2 個特殊模式)。
(1)不淘汰
noeviction(默認)
當內存不足時,直接返回錯誤,不再接受寫入請求(讀請求正常)。
適合當 Redis 作為緩存以外的使用場景,比如嚴格控制數據不丟失。
(2)針對設置了過期時間(TTL)的 key
volatile-lru:在設置了過期時間的 key 中,淘汰最近最少使用的 key。
volatile-lfu:在設置了過期時間的 key 中,淘汰使用頻率最低的 key。
volatile-ttl:在設置了過期時間的 key 中,優先淘汰 TTL(剩余生存時間)最短的 key。
volatile-random:在設置了過期時間的 key 中,隨機淘汰一個 key。
(3)針對所有 key
allkeys-lru:在所有 key 中,淘汰最近最少使用的 key(常見策略)。
allkeys-lfu:在所有 key 中,淘汰使用頻率最低的 key(更智能)。
allkeys-random:在所有 key 中,隨機淘汰一個 key。
3. 各策略優缺點
策略 | 說明 | 優點 | 缺點 | 應用場景 |
---|---|---|---|---|
noeviction | 默認,不淘汰,寫操作報錯 | 數據絕對安全 | 無法繼續寫入 | 嚴格控制數據不可丟失 |
volatile-lru | 在設置過期時間的 key 中淘汰最近最少使用 | 常用緩存策略 | 只作用于設置 TTL 的 key | 緩存系統,定期過期數據 |
allkeys-lru | 在所有 key 中淘汰最近最少使用 | 最常用,命中率高 | 可能誤刪重要數據 | 通用緩存 |
volatile-lfu | 在設置過期時間的 key 中淘汰使用頻率最低 | 更智能的緩存淘汰 | 計算頻率有額外開銷 | 熱點數據緩存 |
allkeys-lfu | 在所有 key 中淘汰使用頻率最低 | 熱點數據保留更久 | 實現復雜,性能略低 | 高頻訪問的緩存系統 |
volatile-ttl | 在設置過期時間的 key 中,優先淘汰 TTL 最短的 | 控制過期優先級 | 使用場景少 | 時間敏感型緩存 |
volatile-random | 在設置過期時間的 key 中隨機淘汰 | 簡單 | 命中率低 | 特殊場景 |
allkeys-random | 在所有 key 中隨機淘汰 | 簡單 | 命中率低 | 低優先級緩存 |
4. 實際推薦方案
allkeys-lru:最常用,適合做緩存,保證熱點數據盡量保留。
allkeys-lfu:Redis 4.0+ 引入,更智能,適合熱點數據集變化較快的場景。
volatile-ttl:適合有明顯過期優先級的業務,例如“臨期數據優先清理”。
5. 總結
Redis 內存滿時需要根據策略來淘汰數據。
LRU(Least Recently Used) → 淘汰最近最少用的數據。
LFU(Least Frequently Used) → 淘汰使用次數最少的數據。
TTL → 優先淘汰即將過期的數據。
推薦 allkeys-lru 或 allkeys-lfu,適合大多數緩存場景。