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

Redis中的過(guò)期策略和淘汰策略使用詳解

 更新時(shí)間:2025年06月18日 10:14:22   作者:你是橙子那我是誰(shuí)  
這篇文章主要介紹了Redis中的過(guò)期策略和淘汰策略使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Redis的過(guò)期策略和淘汰策略

想象一下周末的大型超市:生鮮區(qū)的酸奶貼著"今日特價(jià)"標(biāo)簽,促銷(xiāo)員定時(shí)檢查這些商品的保質(zhì)期;而倉(cāng)庫(kù)管理員正根據(jù)"先進(jìn)先出"原則整理貨架,確保商品不會(huì)過(guò)期積壓。這種高效的商品管理策略,正是Redis處理過(guò)期數(shù)據(jù)和內(nèi)存淘汰機(jī)制的完美比喻。

在實(shí)際開(kāi)發(fā)中,我們經(jīng)常遇到這樣的場(chǎng)景:用戶(hù)登錄會(huì)話(huà)7天后失效,熱點(diǎn)新聞緩存需要保留24小時(shí),促銷(xiāo)活動(dòng)數(shù)據(jù)在活動(dòng)結(jié)束后需要自動(dòng)清理。如果這些數(shù)據(jù)不及時(shí)清理,就會(huì)像超市積壓的過(guò)期商品一樣,占用寶貴的存儲(chǔ)空間,甚至導(dǎo)致系統(tǒng)崩潰。

根據(jù)我多年使用Redis的經(jīng)驗(yàn),合理配置過(guò)期策略和淘汰策略是保證Redis高性能、高可用的關(guān)鍵。今天,我們就來(lái)深入探討Redis如何像高效的超市管理員一樣,智能管理數(shù)據(jù)生命周期。

一、Redis過(guò)期策略

理解了超市商品管理的比喻后,我們來(lái)看看Redis如何給數(shù)據(jù)貼上"保質(zhì)期"標(biāo)簽。

在實(shí)際工作中,我們經(jīng)常會(huì)遇到需要設(shè)置數(shù)據(jù)有效期的場(chǎng)景:

  • 用戶(hù)驗(yàn)證碼5分鐘有效、
  • API訪(fǎng)問(wèn)令牌2小時(shí)有效
  • 每日排行榜在午夜重置。

Redis提供了兩種核心策略來(lái)管理這些過(guò)期數(shù)據(jù),它們就像超市里的兩種質(zhì)檢員,各有分工又相互配合。

1.1 定時(shí)刪除

定時(shí)刪除策略就像超市中負(fù)責(zé)臨期商品檢查的專(zhuān)員。當(dāng)我們?cè)赗edis中設(shè)置一個(gè)鍵的過(guò)期時(shí)間時(shí),Redis會(huì)創(chuàng)建一個(gè)定時(shí)器,在鍵過(guò)期時(shí)立即執(zhí)行刪除操作。

# 設(shè)置鍵值對(duì),并指定30秒后過(guò)期
SET user:session:1234 "user_data" EX 30

# Redis內(nèi)部會(huì)為這個(gè)鍵設(shè)置一個(gè)定時(shí)器
# 30秒后自動(dòng)觸發(fā)刪除操作

上述代碼展示了如何設(shè)置帶有過(guò)期時(shí)間的鍵值對(duì)。EX參數(shù)指定過(guò)期時(shí)間(秒),Redis會(huì)為此鍵創(chuàng)建定時(shí)器,到期自動(dòng)刪除。

經(jīng)驗(yàn)分享: 根據(jù)我的觀(guān)察,定時(shí)刪除策略雖然實(shí)時(shí)性好,但會(huì)創(chuàng)建大量定時(shí)器。在高并發(fā)場(chǎng)景下,如果同時(shí)設(shè)置大量短期過(guò)期的鍵(比如短信驗(yàn)證碼),可能對(duì)性能產(chǎn)生影響。我建議大家可以針對(duì)不同的業(yè)務(wù)場(chǎng)景選擇不同的策略。

1.2 惰性刪除

惰性刪除策略則像超市收銀員在結(jié)賬時(shí)檢查商品保質(zhì)期。只有當(dāng)客戶(hù)端嘗試訪(fǎng)問(wèn)一個(gè)鍵時(shí),Redis才會(huì)檢查該鍵是否過(guò)期,如果過(guò)期就立即刪除。

# 客戶(hù)端嘗試獲取一個(gè)可能過(guò)期的鍵
GET user:session:1234

# Redis內(nèi)部處理流程:
1. 檢查鍵是否存在
2. 如果存在,檢查是否過(guò)期
3. 如果過(guò)期,刪除鍵并返回nil
4. 如果未過(guò)期,返回值

1.3 定期刪除

在實(shí)際應(yīng)用中,Redis采用了折衷方案:定期刪除。這就像超市安排員工每隔一段時(shí)間抽查部分貨架,檢查商品保質(zhì)期。

Redis默認(rèn)每100ms隨機(jī)抽取一定數(shù)量的鍵(默認(rèn)20個(gè))進(jìn)行檢查:

  1. 隨機(jī)選擇20個(gè)設(shè)置過(guò)期時(shí)間的鍵
  2. 刪除其中已過(guò)期的鍵
  3. 如果過(guò)期鍵比例超過(guò)25%,重復(fù)步驟1

場(chǎng)景案例:電商平臺(tái)會(huì)話(huà)管理

假設(shè)場(chǎng)景: 一個(gè)大型電商平臺(tái)使用Redis存儲(chǔ)用戶(hù)會(huì)話(huà),要求用戶(hù)登錄狀態(tài)保持30分鐘活躍期。

挑戰(zhàn): 每天有數(shù)百萬(wàn)用戶(hù)登錄,如果所有會(huì)話(huà)都使用定時(shí)刪除,會(huì)創(chuàng)建大量定時(shí)器;如果只用惰性刪除,可能積累大量過(guò)期會(huì)話(huà)占用內(nèi)存。

解決方案: 考慮到實(shí)際業(yè)務(wù)需求和高并發(fā)場(chǎng)景,我們采用組合策略:

  • 對(duì)普通用戶(hù)會(huì)話(huà)使用惰性刪除+定期刪除組合
  • 對(duì)VIP用戶(hù)會(huì)話(huà)使用定時(shí)刪除,確保及時(shí)釋放資源
  • 配置定期刪除策略增加采樣數(shù)量

效果: 經(jīng)過(guò)三個(gè)版本的迭代,我們發(fā)現(xiàn)內(nèi)存使用減少35%,Redis CPU利用率下降20%,系統(tǒng)穩(wěn)定性顯著提升。

二、Redis淘汰策略

掌握了數(shù)據(jù)保鮮的藝術(shù)后,我們面臨的下一個(gè)挑戰(zhàn)是:當(dāng)超市貨架滿(mǎn)了,新商品該如何上架?同樣地,當(dāng)Redis內(nèi)存使用達(dá)到上限時(shí),新數(shù)據(jù)寫(xiě)入該如何處理?這就是淘汰策略要解決的問(wèn)題。

在實(shí)際工作中,我們經(jīng)常會(huì)遇到Redis內(nèi)存不足的情況,特別是在處理突發(fā)流量或大數(shù)據(jù)量時(shí)。Redis提供了8種淘汰策略,就像超市有多種商品淘汰標(biāo)準(zhǔn)一樣,我們需要根據(jù)業(yè)務(wù)特點(diǎn)選擇最合適的策略。

2.1 淘汰策略全景圖

策略說(shuō)明適用場(chǎng)景
noeviction不淘汰,新寫(xiě)入操作報(bào)錯(cuò)關(guān)鍵數(shù)據(jù)不能丟失的場(chǎng)景
allkeys-lru從所有鍵中淘汰最近最少使用的鍵通用場(chǎng)景,平衡性能
volatile-lru從設(shè)置過(guò)期時(shí)間的鍵中淘汰最近最少使用的鍵區(qū)分永久數(shù)據(jù)和臨時(shí)數(shù)據(jù)
allkeys-random從所有鍵中隨機(jī)淘汰所有鍵訪(fǎng)問(wèn)概率均等
volatile-random從設(shè)置過(guò)期時(shí)間的鍵中隨機(jī)淘汰臨時(shí)數(shù)據(jù)隨機(jī)淘汰
volatile-ttl從設(shè)置過(guò)期時(shí)間的鍵中淘汰存活時(shí)間最短的鍵優(yōu)先淘汰即將過(guò)期的數(shù)據(jù)
allkeys-lfu從所有鍵中淘汰最不經(jīng)常使用的鍵熱點(diǎn)數(shù)據(jù)區(qū)分明顯的場(chǎng)景
volatile-lfu從設(shè)置過(guò)期時(shí)間的鍵中淘汰最不經(jīng)常使用的鍵臨時(shí)數(shù)據(jù)中區(qū)分熱點(diǎn)數(shù)據(jù)

2.2 LRU與LFU算法深度解析

在淘汰策略中,LRU(最近最少使用)和LFU(最不經(jīng)常使用)是最常用的兩種算法。它們就像超市淘汰商品的兩種思路:

# Redis配置淘汰策略(redis.conf)
maxmemory 2gb
maxmemory-policy allkeys-lfu

# 查看當(dāng)前內(nèi)存策略
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lfu"

上述配置設(shè)置Redis最大內(nèi)存為2GB,并使用allkeys-lfu淘汰策略。通過(guò)CONFIG GET命令可以驗(yàn)證當(dāng)前配置。

千萬(wàn)要避免: 默認(rèn)的noeviction策略在生產(chǎn)環(huán)境可能導(dǎo)致寫(xiě)入失敗。我建議大家在項(xiàng)目上線(xiàn)前一定要檢查這個(gè)配置。

場(chǎng)景案例:新聞應(yīng)用熱點(diǎn)排行榜

假設(shè)場(chǎng)景: 一個(gè)新聞應(yīng)用使用Redis存儲(chǔ)熱點(diǎn)新聞排行榜,內(nèi)存經(jīng)常達(dá)到上限。

挑戰(zhàn): 熱點(diǎn)新聞變化快,舊新聞需要及時(shí)淘汰,但突發(fā)新聞可能突然成為熱點(diǎn)。

解決方案: 考慮到實(shí)際業(yè)務(wù)中新聞熱點(diǎn)的變化模式,我們選擇了allkeys-lfu策略:

  • LFU算法能更好識(shí)別新熱點(diǎn)(訪(fǎng)問(wèn)頻率高)
  • 配合過(guò)期時(shí)間設(shè)置(熱點(diǎn)新聞緩存24小時(shí))
  • 監(jiān)控LFU計(jì)數(shù)器,動(dòng)態(tài)調(diào)整策略參數(shù)

效果: 使用LFU策略后,熱點(diǎn)新聞緩存命中率提升40%,冷門(mén)數(shù)據(jù)及時(shí)淘汰,內(nèi)存使用穩(wěn)定在安全閾值內(nèi)。

三、實(shí)戰(zhàn):配置與優(yōu)化指南

理解了Redis的過(guò)期和淘汰策略后,我們來(lái)看看如何在實(shí)際項(xiàng)目中配置和優(yōu)化。相信大家都對(duì)這個(gè)話(huà)題很感興趣,因?yàn)楹侠淼呐渲媚軜O大提升系統(tǒng)性能。

3.1 最佳配置實(shí)踐

根據(jù)我的經(jīng)驗(yàn),不同業(yè)務(wù)場(chǎng)景需要不同的配置策略。下面是一些常見(jiàn)場(chǎng)景的建議:

# 電商平臺(tái)配置示例(redis.conf)
maxmemory 16gb
maxmemory-policy allkeys-lru
maxmemory-samples 10

# 調(diào)整定期刪除策略頻率
hz 10 # 默認(rèn)10,增加CPU使用但更及時(shí)清理

對(duì)于電商平臺(tái),我們使用allkeys-lru策略并調(diào)整采樣數(shù)量。hz參數(shù)控制定期刪除的頻率,增加該值會(huì)更及時(shí)清理過(guò)期鍵,但會(huì)增加CPU使用。

3.2 監(jiān)控與調(diào)優(yōu)

在實(shí)際工作中,我們經(jīng)常會(huì)遇到需要監(jiān)控Redis內(nèi)存使用的情況。我通常是這樣做的:

# 查看內(nèi)存關(guān)鍵指標(biāo)
127.0.0.1:6379> INFO memory

# 重點(diǎn)關(guān)注:
used_memory:已使用內(nèi)存
mem_fragmentation_ratio:內(nèi)存碎片率
expired_keys:已過(guò)期的鍵總數(shù)
evicted_keys:被淘汰的鍵總數(shù)

調(diào)優(yōu)建議: 如果發(fā)現(xiàn)evicted_keys持續(xù)增長(zhǎng),說(shuō)明淘汰頻繁,可能需要擴(kuò)容或優(yōu)化數(shù)據(jù)設(shè)計(jì)。如果expired_keys很高但used_memory不降,可能是定期刪除不夠及時(shí),可以適當(dāng)增加hz值。

場(chǎng)景案例:社交平臺(tái)Feed流緩存

假設(shè)場(chǎng)景: 社交平臺(tái)的用戶(hù)Feed流使用Redis緩存,每個(gè)用戶(hù)最新100條Feed。

挑戰(zhàn): 用戶(hù)量巨大,活躍用戶(hù)Feed更新頻繁,內(nèi)存壓力大。

解決方案: 考慮到實(shí)際用戶(hù)活躍模式和內(nèi)存限制,我們采用多層策略:

  • 使用volatile-ttl策略,設(shè)置Feed數(shù)據(jù)1小時(shí)過(guò)期
  • 配合主動(dòng)刷新機(jī)制,活躍用戶(hù)Feed提前刷新
  • 使用Redis模塊實(shí)現(xiàn)二級(jí)LRU鏈表管理

效果: 通過(guò)這個(gè)案例中的組合策略,內(nèi)存使用減少50%,用戶(hù)訪(fǎng)問(wèn)延遲降低30%,達(dá)到了高性能與資源平衡的效果。

總結(jié)與思考

通過(guò)今天的討論,相信大家對(duì)Redis的過(guò)期策略和淘汰策略有了更深入的理解。讓我們簡(jiǎn)單回顧一下本文的核心內(nèi)容:

  • 過(guò)期策略:定時(shí)刪除(精準(zhǔn)但耗資源)、惰性刪除(高效但可能積累)、定期刪除(平衡之道)
  • 淘汰策略:8種策略適應(yīng)不同場(chǎng)景,重點(diǎn)關(guān)注LRU和LFU算法差異
  • 配置實(shí)踐:根據(jù)業(yè)務(wù)特點(diǎn)選擇策略,監(jiān)控關(guān)鍵指標(biāo)持續(xù)優(yōu)化

在實(shí)際工作中,沒(méi)有放之四海而皆準(zhǔn)的策略。我建議大家可以多嘗試幾種方法,找到最適合自己業(yè)務(wù)場(chǎng)景的配置。根據(jù)我的經(jīng)驗(yàn),合理的過(guò)期和淘汰策略配置可以使Redis性能提升30%-50%。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis中漸進(jìn)式遍歷Scan命令的使用

    Redis中漸進(jìn)式遍歷Scan命令的使用

    在Redis中,一般都會(huì)禁用keys 這種命令,因?yàn)樗鼤?huì)遍歷整個(gè)數(shù)據(jù)庫(kù),會(huì)嚴(yán)重影響redis的性能,本文就來(lái)介紹一下Redis中漸進(jìn)式遍歷Scan命令的使用,感興趣的可以了解一下
    2023-11-11
  • Redis實(shí)現(xiàn)訂單自動(dòng)過(guò)期功能的示例代碼

    Redis實(shí)現(xiàn)訂單自動(dòng)過(guò)期功能的示例代碼

    這篇文章主要介紹了Redis實(shí)現(xiàn)訂單自動(dòng)過(guò)期功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Redis內(nèi)存回收策略

    Redis內(nèi)存回收策略

    Redis也會(huì)因?yàn)閮?nèi)存不足而產(chǎn)生錯(cuò)誤?,?也可能因?yàn)榛厥者^(guò)久而導(dǎo)致系統(tǒng)長(zhǎng)期的停頓,因此掌握?qǐng)?zhí)行回收策略十分有必要,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-11-11
  • Redis的數(shù)據(jù)存儲(chǔ)及String類(lèi)型的實(shí)現(xiàn)

    Redis的數(shù)據(jù)存儲(chǔ)及String類(lèi)型的實(shí)現(xiàn)

    這篇文章主要介紹了Redis的數(shù)據(jù)存儲(chǔ)及String類(lèi)型的實(shí)現(xiàn),redis作為k-v數(shù)據(jù)存儲(chǔ),因查找和操作的時(shí)間復(fù)雜度都是O(1)和豐富的數(shù)據(jù)類(lèi)型及數(shù)據(jù)結(jié)構(gòu)的優(yōu)化,了解了這些數(shù)據(jù)類(lèi)型和結(jié)構(gòu)更有利于我們平時(shí)對(duì)于redis的使用,需要的朋友可以參考下
    2022-10-10
  • 詳解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    詳解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    這篇文章主要介紹了詳解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • Redis緩存異常常用解決方案總結(jié)

    Redis緩存異常常用解決方案總結(jié)

    Redis緩存異常問(wèn)題分別是緩存雪崩,緩存預(yù)熱,緩存穿透,緩存降級(jí),緩存擊穿,本文主要介紹了Redis緩存異常常用解決方案總結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 通過(guò) Redis 實(shí)現(xiàn) RPC 遠(yuǎn)程方法調(diào)用(支持多種編程語(yǔ)言)

    通過(guò) Redis 實(shí)現(xiàn) RPC 遠(yuǎn)程方法調(diào)用(支持多種編程語(yǔ)言)

    這篇文章主要介紹了通過(guò) Redis 實(shí)現(xiàn) RPC 遠(yuǎn)程方法調(diào)用,支持多種編程語(yǔ)言,本文就以Ruby和Python為例,給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-09-09
  • 基于Redis實(shí)現(xiàn)消息隊(duì)列的示例代碼

    基于Redis實(shí)現(xiàn)消息隊(duì)列的示例代碼

    消息隊(duì)列在分布式系統(tǒng)中非常重要,能夠有效解耦系統(tǒng)的各個(gè)模塊,提供異步處理能力和緩沖能力,本文介紹了基于Redis實(shí)現(xiàn)消息隊(duì)列的示例代碼,感興趣的可以了解一下
    2025-04-04
  • Redis刪除過(guò)期key策略詳解

    Redis刪除過(guò)期key策略詳解

    Redis是一款高性能的開(kāi)源內(nèi)存數(shù)據(jù)庫(kù),廣泛應(yīng)用于緩存、消息隊(duì)列、實(shí)時(shí)分析等場(chǎng)景,在Redis中,我們經(jīng)常需要?jiǎng)h除過(guò)期的key,以釋放內(nèi)存空間并保持?jǐn)?shù)據(jù)的有效性,本文將為您詳細(xì)介紹Redis的過(guò)期key刪除策略,幫助您更好地管理和優(yōu)化Redis數(shù)據(jù)庫(kù)
    2023-10-10
  • redis集群搭建_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis集群搭建_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了redis集群搭建,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08

最新評(píng)論