Redis過期刪除機制與內(nèi)存淘汰策略的解析指南
1、簡述
在使用 Redis 構(gòu)建緩存系統(tǒng)時,很多開發(fā)者只設置了 EXPIRE 但卻忽略了背后 Redis 的過期刪除機制與內(nèi)存淘汰策略。理解這兩者非常關鍵,直接關系到你的緩存系統(tǒng)是否高效、穩(wěn)定、可控。
本文將深入剖析 Redis 中的兩類機制:
- 過期刪除策略:key 如何在過期后被清除?
- 內(nèi)存淘汰策略:內(nèi)存滿了之后,哪些 key 會被刪除?
2、Redis 的過期刪除策略(Key Expiration)
Redis 支持給 key 設置 TTL(Time To Live),例如:
SET user:1:name "Tom" EX 60 # 設置60秒后過期
Redis 有三種過期刪除策略:
策略名稱 | 觸發(fā)方式 | 特點與代價 |
---|---|---|
惰性刪除 | 訪問 key 時觸發(fā) | 延遲釋放內(nèi)存,資源占用低,但可能滯留 |
定期刪除 | 每秒掃描過期 key | 有概率清理過期 key,減緩內(nèi)存膨脹 |
主動刪除 | 內(nèi)存不足時觸發(fā) | 與內(nèi)存淘汰策略結(jié)合,主動回收 |
Redis 實際如何執(zhí)行過期?
Redis 并不會在 key 到期的一刻立刻刪除它,而是:
- 每秒隨機抽取一批 key 檢查過期(默認每次檢查 20 個)
- 被訪問的 key 會“惰性檢查”,若過期就順便刪掉
- 在內(nèi)存壓力大時,會加速觸發(fā)清理
3、Redis 內(nèi)存淘汰策略(Eviction Policy)
當 Redis 達到最大內(nèi)存上限(由 maxmemory 指定)時,就必須開始淘汰舊數(shù)據(jù)。此時就輪到 內(nèi)存淘汰策略 發(fā)揮作用。
Redis 提供的 8 種淘汰策略:
策略 | 描述 |
---|---|
noeviction | 默認策略,拒絕寫入新數(shù)據(jù),直接報錯 |
allkeys-lru | 所有 key 中,淘汰最近最少使用的 |
volatile-lru | 只在設置了 TTL 的 key 中,淘汰最少使用的 |
allkeys-random | 所有 key 中,隨機淘汰 |
volatile-random | 只在設置了 TTL 的 key 中,隨機淘汰 |
volatile-ttl | 只淘汰 TTL 最短的 key(最早過期) |
volatile-lfu | 只在設置了 TTL 的 key 中,淘汰最少頻率使用 |
allkeys-lfu | 所有 key 中,淘汰最少頻率使用 |
配置示例:
maxmemory 512mb maxmemory-policy allkeys-lru
4、實踐場景與建議
場景 1:普通緩存場景(推薦)
maxmemory 1gb maxmemory-policy allkeys-lru
優(yōu)點:自動替換最不常訪問的 key,效果最貼近緩存的預期行為
使用方式:
SET user:123 "json-data" EX 300
場景 2:數(shù)據(jù)較重要,只刪除過期 key
maxmemory 1gb maxmemory-policy volatile-lru
僅淘汰設置了過期時間的 key,持久 key 不被動清除
適合混合數(shù)據(jù)結(jié)構(gòu):部分緩存 + 部分持久值
場景 3:用戶限流或驗證碼存儲
SET captcha:uid123 "XYZ" EX 60
結(jié)合 volatile-ttl 策略,可以優(yōu)先清理即將過期的驗證碼等
5、示例:模擬淘汰行為
# 配置 CONFIG SET maxmemory 100kb CONFIG SET maxmemory-policy allkeys-lru # 插入多個 key for i in {1..100}; do SET "key$i" "$(openssl rand -hex 20)" done # 查看哪些 key 被淘汰了 INFO stats | grep evicted
輸出示例:
evicted_keys:57
說明有 57 個 key 被自動淘汰,Redis 按 LRU 策略生效。
- 附加建議
- Redis 淘汰的是“key”,不是“內(nèi)存最占用的值”
- Redis 7.0+ 中 LFU 策略適合熱點數(shù)據(jù),尤其在流量分布極不均衡時更精準
- 若你使用 Redis 作為數(shù)據(jù)庫(而非緩存),應避免使用淘汰策略,并開啟持久化
6、總結(jié)
分類 | 策略類型 | 控制方式 | 推薦場景 |
---|---|---|---|
過期刪除策略 | 惰性/定期 | 自動 | 所有 Redis 使用 |
內(nèi)存淘汰策略 | 8 種策略 | 配置項控制 | 緩存系統(tǒng)、高頻數(shù)據(jù) |
推薦配置模板
# 設置最大內(nèi)存限制 maxmemory 512mb # 設置淘汰策略 maxmemory-policy allkeys-lru
到此這篇關于Redis過期刪除機制與內(nèi)存淘汰策略的解析指南的文章就介紹到這了,更多相關Redis過期刪除與內(nèi)存淘汰內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Redis優(yōu)化token校驗主動失效的實現(xiàn)方案
在普通的token頒發(fā)和校驗中 當用戶發(fā)現(xiàn)自己賬號和密碼被暴露了時修改了登錄密碼后舊的token仍然可以通過系統(tǒng)校驗直至token到達失效時間,所以系統(tǒng)需要token主動失效的一種能力,所以本文給大家介紹了Redis優(yōu)化token校驗主動失效的實現(xiàn)方案,需要的朋友可以參考下2024-03-03