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