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

5.性能優(yōu)化建議
監(jiān)控過期 Key 數(shù)量:
# 查看過期 Key 相關(guān)信息 redis-cli info stats | grep expired_keys
合理配置:
# 根據(jù)負(fù)載調(diào)整 hz 值 hz 100 # 更高頻率(更及時(shí)清理,更高CPU) hz 1 # 更低頻率(更少CPU,可能堆積)
避免大量 Key 同時(shí)過期:
# 不好的做法:同時(shí)設(shè)置相同過期時(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í),過期 Key 不會被保存
- AOF:Key 過期時(shí),會追加一條
DEL命令
主從復(fù)制:
- 主節(jié)點(diǎn)刪除過期 Key 后,會向從節(jié)點(diǎn)發(fā)送
DEL命令 - 從節(jié)點(diǎn)不會主動刪除過期 Key,只接受主節(jié)點(diǎn)指令
集群模式:
- 每個節(jié)點(diǎn)獨(dú)立管理自己的過期 Key
- 遷移槽位時(shí),過期信息一并遷移
總結(jié)
Redis 的過期刪除策略是 惰性刪除 + 定期刪除 的組合拳:
- 惰性刪除:保證訪問的正確性
- 定期刪除:減少內(nèi)存浪費(fèi)
- 內(nèi)存淘汰:防止內(nèi)存耗盡的最后防線
這種設(shè)計(jì)在 CPU 使用率、內(nèi)存效率和實(shí)現(xiàn)復(fù)雜性之間取得了良好的平衡,使得 Redis 能夠高效處理大量帶有過期時(shí)間的 Key。
到此這篇關(guān)于Redis Key過期刪除策略使用小結(jié)的文章就介紹到這了,更多相關(guān)Redis Key過期刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis集群下過期key監(jiān)聽的實(shí)現(xiàn)代碼
- Redis過期Key刪除策略和內(nèi)存淘汰策略的實(shí)現(xiàn)
- Redis通過scan查找不過期的 key(方法詳解)
- Redis刪除過期key策略詳解
- redis key過期監(jiān)聽的實(shí)現(xiàn)示例
- Redis監(jiān)聽過期的key實(shí)現(xiàn)流程詳解
- redis?key鍵過期刪除策略及淘汰機(jī)制探究
- Redis中key過期策略的實(shí)現(xiàn)
- Redis?key的過期時(shí)間和永久有效的實(shí)現(xiàn)
- Redis設(shè)置key的過期時(shí)間
- redis監(jiān)聽key過期事件的詳細(xì)步驟
相關(guān)文章
Redis設(shè)置過期時(shí)間的實(shí)現(xiàn)示例
在使用redis作為緩存存儲值的時(shí)候,一般都是需要設(shè)置值的過期時(shí)間,本文主要介紹了Redis設(shè)置過期時(shí)間的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2025-06-06
Redis 的過期策略與鍵的過期時(shí)間設(shè)置方法
Redis通過惰性刪除和定期刪除策略管理內(nèi)存,提供多種命令設(shè)置鍵的過期時(shí)間,并通過過期字典高效處理過期鍵,合理設(shè)置過期時(shí)間、監(jiān)控過期鍵數(shù)量和避免大量鍵同時(shí)過期是最佳實(shí)踐,本文介紹Redis 的過期策略與鍵的過期時(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

