欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis過期數(shù)據(jù)清理的策略實戰(zhàn)

 更新時間:2025年08月25日 10:01:13   作者:碼農(nóng)技術(shù)棧  
Redis中的過期鍵過期后不會立即從內(nèi)存中刪除,而是在后臺進(jìn)程中異步清理,如果不清理過期數(shù)據(jù),Redis內(nèi)存中的數(shù)據(jù)會越來越多,在實際應(yīng)用中,Redis 的過期數(shù)據(jù)淘汰策略可以通過多種方式實現(xiàn),以下是基于惰性刪除和定期刪除兩種機(jī)制的示例代碼以及最佳實踐

一句話真相:Redis的過期清理就像"超市臨期商品管理"——惰性刪除是顧客結(jié)賬時檢查保質(zhì)期,定期刪除是店員定時巡檢貨架!

一、為什么需要數(shù)據(jù)過期?內(nèi)存管理的生死線

真實案例:某社交App因未設(shè)過期時間,3000萬用戶會話數(shù)據(jù)永久堆積,導(dǎo)致:

  • 內(nèi)存爆滿,服務(wù)崩潰
  • 從Redis恢復(fù)數(shù)據(jù)耗時3小時
  • 直接損失800萬訂單!

Redis內(nèi)存警告:

127.0.0.1:6379> info memory  
used_memory_human:6.0G   # 內(nèi)存使用量  
maxmemory_human:8.0G     # 內(nèi)存上限  
mem_fragmentation_ratio:1.8  # 碎片率過高!  

二、過期策略雙核心:惰性刪除 + 定期刪除

策略觸發(fā)時機(jī)優(yōu)點(diǎn)缺點(diǎn)
惰性刪除訪問Key時檢查零額外CPU消耗冷數(shù)據(jù)長期不釋放
定期刪除定時隨機(jī)掃描主動釋放內(nèi)存可能短時阻塞

三、惰性刪除:精準(zhǔn)狙擊的"特工"

1. 執(zhí)行流程

客戶端Redis過期字典GET user:1001:session檢查key是否過期?已過期(返回1)刪除key(nil)客戶端Redis過期字典

2. 源碼實現(xiàn)(C語言偽代碼)

int expireIfNeeded(redisDb *db, robj *key) {  
    if (!keyIsExpired(db,key)) return 0;  // 未過期  
    deleteKey(db,key);                   // 執(zhí)行刪除  
    return 1;  
}  

robj *lookupKeyRead(redisDb *db, robj *key) {  
    if (expireIfNeeded(db,key) == 1) {   // 檢查過期  
        return NULL;  // 已刪除返回空  
    }  
    return lookupKey(db,key);  
}  

3. 實戰(zhàn)風(fēng)險:僵尸Key問題

場景:

# 大量已過期但永不訪問的Key  
SET access_log:20230101 "big_data" EX 86400  

后果:內(nèi)存被無形占用,可用空間持續(xù)減少!

四、定期刪除:主動出擊的"巡邏隊"

1. 三層漸進(jìn)式掃描

2. 核心算法參數(shù)

// redis.conf 配置  
hz 10  // 每秒執(zhí)行10次定期刪除(默認(rèn))  

// 源碼參數(shù)  
#define ACTIVE_EXPIRE_CYCLE_KEYS_PER_LOOP 20 // 每次掃描20個key  
#define ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC 25 // CPU占用≤25%  

3. 性能優(yōu)化:自適應(yīng)掃描

  • CPU空閑時:增加掃描頻次(hz 100
  • 內(nèi)存緊張時:每次掃描更多Key(可調(diào)參)

五、內(nèi)存耗盡時的最后防線:淘汰策略

當(dāng)內(nèi)存超maxmemory時觸發(fā):

策略機(jī)制適用場景
volatile-lru(默認(rèn))淘汰最近最少使用的過期Key緩存場景
allkeys-lru淘汰所有Key中的LRU內(nèi)存不足時優(yōu)先選擇
volatile-ttl淘汰剩余生存時間最短的Key時效性敏感數(shù)據(jù)
noeviction拒絕寫入并報錯關(guān)鍵數(shù)據(jù)不允許丟失

配置方式:

# redis.conf  
maxmemory 8gb  
maxmemory-policy volatile-lru  

六、四大實戰(zhàn)陷阱與解決方案

陷阱1:過期Key集中導(dǎo)致雪崩

場景:

# 同一秒設(shè)置大量Key過期  
SET key1 value EX 3600  
SET key2 value EX 3600  # 同時設(shè)置100萬Key  

后果:3600秒后同時過期 → 定期刪除壓力暴增!

解決方案:

# 添加隨機(jī)過期時間偏移  
expire_time = 3600 + random.randint(0, 600)  # 增加0-10分鐘隨機(jī)值  
redis.setex(key, expire_time, value)  

陷阱2:大Key刪除阻塞服務(wù)

案例:刪除10MB的Hash Key耗時150ms → 阻塞其他請求!

優(yōu)化方案:

# 異步刪除(Redis 4.0+)  
UNLINK big_key  # 非阻塞刪除  

# 分批次刪除  
HSCAN big_key 0 COUNT 100  # 分批遍歷  
HDEL big_key field1 field2 ...  # 分批刪除  

陷阱3:主從不一致

問題:主庫刪除過期Key后,從庫可能未同步刪除

解決方案:

# 開啟從庫主動檢測(Redis 3.2+)  
replica-serve-stale-data no  

陷阱4:持久化導(dǎo)致過期復(fù)活

原理:RDB快照中的過期Key重啟后重新加載

規(guī)避方法:

# 啟用AOF重寫時主動刪除過期Key  
aof-rewrite-incremental-fsync yes  

七、最佳配置指南

1. 生產(chǎn)環(huán)境推薦配置

# 內(nèi)存上限(物理內(nèi)存70%)  
maxmemory 16gb  

# 淘汰策略(緩存場景)  
maxmemory-policy volatile-lru  

# 定期刪除頻率  
hz 10  

# 開啟異步刪除  
lazyfree-lazy-eviction yes  

2. 監(jiān)控命令大全

# 查看過期Key數(shù)量  
redis-cli info | grep expired_keys  

# 內(nèi)存碎片率  
redis-cli info | grep mem_fragmentation_ratio  

# 實時監(jiān)控淘汰情況  
redis-cli --stat  

八、總結(jié):Redis過期數(shù)據(jù)清理三原則

  1. 雙重保障:
    • 訪問時檢查(惰性刪除)
    • 定時主動掃描(定期刪除)
  2. 淘汰兜底:內(nèi)存不足時按策略清理
  3. 避坑關(guān)鍵:
    • 分散過期時間
    • 大Key異步刪除
    • 監(jiān)控碎片率

黃金口訣:

  • 冷門數(shù)據(jù)靠定期掃
  • 熱點(diǎn)訪問惰性刪
  • 內(nèi)存爆炸淘汰保

以上就是Redis過期數(shù)據(jù)清理的策略實戰(zhàn)的詳細(xì)內(nèi)容,更多關(guān)于Redis過期數(shù)據(jù)清理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 全網(wǎng)最完整的Redis新手入門指導(dǎo)教程

    全網(wǎng)最完整的Redis新手入門指導(dǎo)教程

    這篇文章主要給大家介紹了Redis新手入門的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Redis中List實現(xiàn)雙鏈表

    Redis中List實現(xiàn)雙鏈表

    本文主要介紹了Redis中List實現(xiàn)雙鏈表,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • redis中的bitmap你了解嗎

    redis中的bitmap你了解嗎

    這篇文章主要為大家詳細(xì)介紹了redis中的bitmap,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Redis與MySQL數(shù)據(jù)一致性問題的策略模式及解決方案

    Redis與MySQL數(shù)據(jù)一致性問題的策略模式及解決方案

    開發(fā)中,一般會使用Redis緩存一些常用的熱點(diǎn)數(shù)據(jù)用來減少數(shù)據(jù)庫IO,提高系統(tǒng)的吞吐量,本文將給大家介紹了Redis與MySQL數(shù)據(jù)一致性問題的策略模式及解決方案,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Linux安裝Redis、后臺運(yùn)行、系統(tǒng)自啟動的設(shè)置方法

    Linux安裝Redis、后臺運(yùn)行、系統(tǒng)自啟動的設(shè)置方法

    Redis是用C語言編寫的開源免費(fèi)的高性能的分布式內(nèi)存數(shù)據(jù)庫,基于內(nèi)存運(yùn)行并支持持久化的NoSQL數(shù)據(jù)庫。這篇文章主要介紹了Linux安裝Redis、后臺運(yùn)行、系統(tǒng)自啟動,需要的朋友可以參考下
    2020-01-01
  • Redis鍵值設(shè)計的具體實現(xiàn)

    Redis鍵值設(shè)計的具體實現(xiàn)

    本文主要介紹了Redis鍵值設(shè)計的具體實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Redis使用布隆過濾器解決緩存雪崩的問題

    Redis使用布隆過濾器解決緩存雪崩的問題

    布隆過濾器可以幫助我們解決Redis緩存雪崩的問題,那什么是布隆過濾器、布隆過濾器又是如何使用如何解決緩存雪崩的問題的,讓我們帶著這一系列的問題去詳細(xì)了解布隆過濾器,感興趣的小伙伴跟著小編一起來看看吧
    2024-02-02
  • Redis如何一鍵部署腳本

    Redis如何一鍵部署腳本

    這篇文章主要介紹了Redis如何一鍵部署腳本,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Redis+aop實現(xiàn)接口防刷(冪等)的解決方案

    Redis+aop實現(xiàn)接口防刷(冪等)的解決方案

    在高并發(fā)場景下,可能會因為網(wǎng)絡(luò)或者服務(wù)器原因,造成延遲,同時就是有可能會有人用腳本大量訪問你的接口,造成資源崩潰,所以本文給大家介紹了Redis+aop實現(xiàn)接口防刷(冪等)的解決方案,需要的朋友可以參考下
    2024-03-03
  • Windows下搭建Redis哨兵集群模式的方法步驟

    Windows下搭建Redis哨兵集群模式的方法步驟

    哨兵模式,是基于主從復(fù)制模式,主從復(fù)制的優(yōu)點(diǎn)全都擁有,并且主從可以實現(xiàn)自動切換,故障轉(zhuǎn)移等功能,本文主要介紹了Windows下搭建Redis哨兵集群模式的方法步驟,文中通過圖文介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下,需要的朋友可以參考下
    2023-09-09

最新評論