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

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