Redis 提供 8 種內存淘汰策略,以下是詳細解析及場景建議:
一、核心策略解析
-
noeviction (默認策略)
- 機制:內存滿時拒絕新寫入操作,返回錯誤
- 優勢:絕對數據安全
- 場景:金融交易系統、醫療數據存儲
-
allkeys-lru (推薦通用策略)
- 機制:全局淘汰最久未使用的鍵
- 優勢:自動識別冷熱數據
- 場景:電商商品緩存、新聞資訊系統
-
volatile-lru
- 機制:僅淘汰帶過期時間的LRU鍵
- 優勢:保護持久化數據
- 場景:會話緩存 + 持久化數據混合存儲
-
allkeys-random
- 機制:隨機淘汰任意鍵
- 優勢:簡單高效
- 場景:臨時數據緩存、壓力測試環境
-
volatile-random
- 機制:隨機淘汰帶過期時間的鍵
- 優勢:有限范圍內的隨機淘汰
- 場景:定時刷新緩存池
二、特殊場景策略
-
volatile-ttl
- 機制:優先淘汰最快過期的鍵
- 優勢:精確控制數據生命周期
- 場景:限時搶購庫存緩存、驗證碼存儲
-
allkeys-lfu (4.0+)
- 機制:淘汰使用頻率最低的鍵
- 優勢:長期保留高頻數據
- 場景:用戶畫像數據、熱門推薦數據
-
volatile-lfu (4.0+)
- 機制:淘汰帶過期時間的低頻鍵
- 優勢:兼顧頻率和有效期
- 場景:周期性熱點數據緩存
三、配置示例
# 設置最大內存為4GB
maxmemory 4gb
# 使用LFU策略(生產推薦)
maxmemory-policy allkeys-lfu
四、決策樹參考
內存敏感型系統 → 選擇LFU策略
時間敏感型數據 → 選擇TTL策略
數據重要性分層 → 使用volatile系列
突發流量防護 → 使用allkeys-random
注:LFU策略需Redis 4.0+版本支持,建議生產環境優先使用LFU系列策略,可通過OBJECT FREQ
命令實時監控鍵訪問頻率。
過期鍵刪除策略
Redis 的過期鍵刪除策略主要有兩種,配合內存淘汰機制共同管理鍵生命周期:
1. 惰性刪除(被動刪除)
實現原理:
當客戶端訪問某個鍵時,Redis 會先檢查該鍵是否已過期。如果過期則立即刪除,否則返回數據。
優勢:
- 節省 CPU 資源(只在訪問時檢查)
- 對正常讀寫無性能影響
適用場景:
- 過期鍵被頻繁訪問的場景
- 對內存占用不敏感的長期運行系統
2. 定期刪除(主動刪除)
實現原理:
Redis 以固定頻率(默認每秒 10 次)隨機掃描設置了過期時間的鍵:
- 從過期字典中隨機抽取 20 個鍵
- 刪除其中已過期的鍵
- 如果過期的鍵比例超過 25%,重復步驟 1
優勢:
- 主動釋放內存空間
- 減少內存泄漏風險
適用場景:
- 存在大量長期不訪問的過期鍵
- 對內存敏感需要主動清理的場景
3. 內存淘汰機制(補充策略)
當內存達到 maxmemory
限制時,Redis 會根據配置執行淘汰策略,常用策略包括:
volatile-lru
:淘汰最近最少使用的過期鍵volatile-ttl
:淘汰剩余存活時間最短的鍵allkeys-lru
:淘汰整個數據集中的最近最少使用鍵
策略組合:
Redis 默認采用 惰性刪除 + 定期刪除 組合策略,配合內存淘汰機制形成三級防御:
- 定期刪除主動清理大部分過期鍵
- 惰性刪除處理漏網之魚
- 內存淘汰機制兜底防止內存溢出