?
目錄
- Redis 3.0 的淘汰機制——近似 LRU 算法
- Redis 4.0 的新增的淘汰機制——LFU 算法
過期鍵刪除策略
Redis 為管理內存,對設置了過期時間的鍵采用了以下三種刪除策略:
- 描述:為每個設置了過期時間的鍵創建一個定時器,到達過期時間立即清除。
- 缺點:需要消耗大量的 CPU 資源來處理定時器,影響緩存響應時間和吞吐量。
- 描述:只有在訪問某個鍵時才判斷其是否過期,過期則清除。
- 描述:每隔一定時間掃描
expires
字典中的部分鍵,清除過期鍵。 - 優點:折中策略,通過調整掃描時間間隔和每次掃描數量,平衡 CPU 和內存資源。
默認使用惰性過期 (Lazy Expiration)和定期刪除 (Periodic Deletion) 兩者結合的方式,能夠在性能和內存使用之間找到一個良好的平衡。
內存淘汰機制
內存限制設置
- Redis 可以通過參數
maxmemory
設置內存最大限制,從而避免 Redis 占滿機器的內存,影響其他服務。 - 在 32 位系統 上,Redis 最大支持內存為 3GB(32 位系統最大內存為 4GB)。
- 在 64 位系統 上,Redis 的最大內存限制為物理機的可用內存。
Redis 的 maxmemory
參數和內存淘汰機制,使其成為一種有效的緩存方案,是 Memcached 的有效替代方案。
常見策略
當內存達到 maxmemory
限制時,Redis 會按照 maxmemory-policy
啟動相應的淘汰策略,Redis 默認的內存淘汰策略是:noeviction。常見策略如下:
1. 針對設置了過期時間的鍵
volatile-lru
:僅對設置了過期時間的鍵,淘汰最近最少使用的鍵。volatile-ttl
:僅對設置了過期時間的鍵,淘汰剩余時間最短的鍵。volatile-random
:僅對設置了過期時間的鍵,隨機淘汰。volatile-lfu
:僅對設置了過期時間的鍵,淘汰訪問頻率最低的鍵。
2. 針對所有鍵
allkeys-lru
:對所有鍵,淘汰最近最少使用的鍵。allkeys-random
:對所有鍵,隨機淘汰。allkeys-lfu
:對所有鍵,淘汰訪問頻率最低的鍵。
3. 無淘汰策略
noeviction
:不進行淘汰,當內存超限時直接返回錯誤。
Redis 3.0 的淘汰機制——近似 LRU 算法
策略 | 含義 | 特性 |
---|
noeviction | 不淘汰 | 內存超限后寫命令返回錯誤(如 OOM,del 命令除外)。 |
allkeys-lru | | 在所有鍵中按照最近最少使用(LRU)原則剔除鍵,釋放空間。 |
volatile-lru | | 僅在設置了過期時間的鍵范圍內按照 LRU 原則淘汰鍵(未設置過期時間則不淘汰)。 |
allkeys-random | | |
volatile-random | | |
volatile-ttl | 設置過期鍵按 TTL 淘汰 | |
LRU(Least Recently Used)優化設計
Redis 的 LRU 算法經過優化,保證內存占用與淘汰效果之間的平衡,體現了工程實現中對 空間與時間的折中。
注意:在主從復制模式(Replication)下,如果從節點達到 maxmemory
限制,不會記錄任何異常日志,但增量數據無法同步到從節點。
1. LRU 算法優化
- Redis 3.0 的 LRU 算法是近似實現,并非精確 LRU。
- 為了平衡內存占用與性能,Redis 在實現 LRU 時使用了 采樣方法:
- 默認從固定數量的鍵(由
maxmemory-samples
決定)中隨機挑選一定數量的鍵進行比較,淘汰其中最符合 LRU 策略的鍵。 - 默認采樣值為 5,可以通過
maxmemory-samples
調整。
- 使用
CONFIG SET maxmemory-samples <count>
動態調整采樣數量,采樣越多越接近理論 LRU,但會增加性能開銷。
2. 近似 LRU 的特點
- 缺點:可能導致部分鍵未能準確淘汰,尤其在訪問模式復雜時。
- 訪問模式接近冪次分布時,近似 LRU 效果與理論 LRU 非常接近,幾乎無差別。
3. 近似 LRU 與理論 LRU 效果對比

- 當數據訪問模式接近冪次分布(大部分訪問集中于少數鍵)時,近似 LRU 表現與理論 LRU 幾乎無差別。
Redis 4.0 的新增的淘汰機制——LFU 算法
1. LFU 算法
- Redis 4.0 引入了 LFU(Least Frequently Used) 算法,專注于鍵的訪問頻率,而非最近訪問時間。
- 使用 Morris counters(一種稀疏計數器算法)記錄訪問頻率,占用內存極小。
- 計數器會隨著時間衰減,以降低舊訪問對頻率統計的影響。
- 提供參數配置計數更新頻率和衰減速度,靈活控制緩存命中率。
2. LFU 的特點
- 優點:更適合評估鍵的整體重要性,避免 LRU 中因短期高頻訪問造成的緩存污染。
3. 相關策略
allkeys-lfu
:對所有鍵按 LFU 策略淘汰。volatile-lfu
:僅對設置了過期時間的鍵按 LFU 策略淘汰。
閱讀原文:原文鏈接
該文章在 2025/3/17 10:30:15 編輯過