Redis Key過(guò)期刪除策略使用小結(jié)
Redis 的 Key 過(guò)期數(shù)據(jù)刪除策略是 Redis 內(nèi)存管理的關(guān)鍵部分,它通過(guò) 兩種主要策略 相結(jié)合的方式清理過(guò)期數(shù)據(jù):
1.被動(dòng)刪除(惰性刪除 - Lazy Expiration)
工作原理:
- 當(dāng)客戶(hù)端嘗試訪(fǎng)問(wèn)某個(gè) Key 時(shí),Redis 會(huì)先檢查該 Key 是否已過(guò)期
- 如果過(guò)期,則立即刪除并返回 nil(就像 Key 不存在一樣)
- 如果未過(guò)期,則正常返回?cái)?shù)據(jù)
優(yōu)點(diǎn):
- CPU 友好,只在訪(fǎng)問(wèn)時(shí)消耗資源
- 簡(jiǎn)單直接,不影響未訪(fǎng)問(wèn)的 Key
缺點(diǎn):
- 內(nèi)存不友好,不訪(fǎng)問(wèn)的過(guò)期 Key 會(huì)一直占用內(nèi)存
- 可能導(dǎo)致內(nèi)存泄露(如果某些過(guò)期 Key 永不被訪(fǎng)問(wèn))
2.主動(dòng)刪除(定期刪除 - Periodic Expiration)
工作原理:
Redis 會(huì)周期性地(默認(rèn)每秒 10 次)執(zhí)行以下操作:
- 隨機(jī)測(cè)試:從設(shè)置了過(guò)期時(shí)間的 Key 集合中隨機(jī)選擇 20 個(gè) Key
- 檢查過(guò)期:刪除其中所有已過(guò)期的 Key
- 調(diào)整頻率:如果超過(guò) 25% 的 Key 已過(guò)期,則重復(fù)步驟 1-2
- 限制時(shí)間:每次掃描最多持續(xù) 25ms,避免阻塞主線(xiàn)程
配置參數(shù)(redis.conf):
# 每秒執(zhí)行過(guò)期掃描的次數(shù)(默認(rèn) 10) hz 10 # 每次掃描的 CPU 時(shí)間百分比上限(默認(rèn) 25%) # 實(shí)際上每次掃描最多 25ms(1000ms/hz * 25%)
優(yōu)點(diǎn):
- 減少內(nèi)存中過(guò)期 Key 的堆積
- 在 CPU 和內(nèi)存之間取得平衡
缺點(diǎn):
- 不是實(shí)時(shí)的,可能存在過(guò)期 Key 未被及時(shí)清理
- 增加了一定的 CPU 開(kāi)銷(xiāo)
3.內(nèi)存淘汰策略(Eviction Policies)
當(dāng)內(nèi)存達(dá)到 maxmemory 限制時(shí),Redis 會(huì)根據(jù)配置的策略刪除數(shù)據(jù):
# 內(nèi)存限制(默認(rèn)不限制) maxmemory <bytes> # 淘汰策略 maxmemory-policy <policy>
淘汰策略選項(xiàng):
| 策略<policy> | 描述 | 適用場(chǎng)景 |
|---|---|---|
| noeviction | 不淘汰,返回錯(cuò)誤 | 數(shù)據(jù)絕對(duì)不能丟失 |
| allkeys-lru | 從所有 Key 中使用 LRU | 需要緩存效果 |
| volatile-lru | 從帶過(guò)期時(shí)間的 Key 中使用 LRU | 混合使用 |
| allkeys-random | 隨機(jī)刪除所有 Key | 所有 Key 同等重要 |
| volatile-random | 隨機(jī)刪除帶過(guò)期時(shí)間的 Key | 混合使用 |
| volatile-ttl | 刪除即將過(guò)期的 Key(TTL最?。?/td> | 優(yōu)先保留新數(shù)據(jù) |
| allkeys-lfu | 從所有 Key 中使用 LFU(4.0+) | 訪(fǎng)問(wèn)頻率重要 |
| volatile-lfu | 從帶過(guò)期時(shí)間的 Key 中使用 LFU(4.0+) | 混合使用 |
4.實(shí)際工作流程示例

5.性能優(yōu)化建議
監(jiān)控過(guò)期 Key 數(shù)量:
# 查看過(guò)期 Key 相關(guān)信息 redis-cli info stats | grep expired_keys
合理配置:
# 根據(jù)負(fù)載調(diào)整 hz 值 hz 100 # 更高頻率(更及時(shí)清理,更高CPU) hz 1 # 更低頻率(更少CPU,可能堆積)
避免大量 Key 同時(shí)過(guò)期:
# 不好的做法:同時(shí)設(shè)置相同過(guò)期時(shí)間
for i in range(100000):
redis.set(f"key:{i}", "data", ex=3600)
# 好的做法:添加隨機(jī)偏移
for i in range(100000):
redis.set(f"key:{i}", "data", ex=3600 + random.randint(0, 300))6.特殊情況處理
AOF/RDB 持久化:
- RDB:生成快照時(shí),過(guò)期 Key 不會(huì)被保存
- AOF:Key 過(guò)期時(shí),會(huì)追加一條
DEL命令
主從復(fù)制:
- 主節(jié)點(diǎn)刪除過(guò)期 Key 后,會(huì)向從節(jié)點(diǎn)發(fā)送
DEL命令 - 從節(jié)點(diǎn)不會(huì)主動(dòng)刪除過(guò)期 Key,只接受主節(jié)點(diǎn)指令
集群模式:
- 每個(gè)節(jié)點(diǎn)獨(dú)立管理自己的過(guò)期 Key
- 遷移槽位時(shí),過(guò)期信息一并遷移
總結(jié)
Redis 的過(guò)期刪除策略是 惰性刪除 + 定期刪除 的組合拳:
- 惰性刪除:保證訪(fǎng)問(wèn)的正確性
- 定期刪除:減少內(nèi)存浪費(fèi)
- 內(nèi)存淘汰:防止內(nèi)存耗盡的最后防線(xiàn)
這種設(shè)計(jì)在 CPU 使用率、內(nèi)存效率和實(shí)現(xiàn)復(fù)雜性之間取得了良好的平衡,使得 Redis 能夠高效處理大量帶有過(guò)期時(shí)間的 Key。
到此這篇關(guān)于Redis Key過(guò)期刪除策略使用小結(jié)的文章就介紹到這了,更多相關(guān)Redis Key過(guò)期刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis集群下過(guò)期key監(jiān)聽(tīng)的實(shí)現(xiàn)代碼
- Redis過(guò)期Key刪除策略和內(nèi)存淘汰策略的實(shí)現(xiàn)
- Redis通過(guò)scan查找不過(guò)期的 key(方法詳解)
- Redis刪除過(guò)期key策略詳解
- redis key過(guò)期監(jiān)聽(tīng)的實(shí)現(xiàn)示例
- Redis監(jiān)聽(tīng)過(guò)期的key實(shí)現(xiàn)流程詳解
- redis?key鍵過(guò)期刪除策略及淘汰機(jī)制探究
- Redis中key過(guò)期策略的實(shí)現(xiàn)
- Redis?key的過(guò)期時(shí)間和永久有效的實(shí)現(xiàn)
- Redis設(shè)置key的過(guò)期時(shí)間
- redis監(jiān)聽(tīng)key過(guò)期事件的詳細(xì)步驟
相關(guān)文章
Redis設(shè)置過(guò)期時(shí)間的實(shí)現(xiàn)示例
在使用redis作為緩存存儲(chǔ)值的時(shí)候,一般都是需要設(shè)置值的過(guò)期時(shí)間,本文主要介紹了Redis設(shè)置過(guò)期時(shí)間的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2025-06-06
redis list類(lèi)型命令的實(shí)現(xiàn)
本文主要介紹了redis list類(lèi)型命令的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Redis 的過(guò)期策略與鍵的過(guò)期時(shí)間設(shè)置方法
Redis通過(guò)惰性刪除和定期刪除策略管理內(nèi)存,提供多種命令設(shè)置鍵的過(guò)期時(shí)間,并通過(guò)過(guò)期字典高效處理過(guò)期鍵,合理設(shè)置過(guò)期時(shí)間、監(jiān)控過(guò)期鍵數(shù)量和避免大量鍵同時(shí)過(guò)期是最佳實(shí)踐,本文介紹Redis 的過(guò)期策略與鍵的過(guò)期時(shí)間設(shè)置,感興趣的朋友一起看看吧2025-03-03
redis底層數(shù)據(jù)結(jié)構(gòu)之ziplist實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了redis底層數(shù)據(jù)結(jié)構(gòu)之ziplist實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

