Redis的過期策略和淘汰策略

Redis的過期策略和淘汰策略

想象一下周末的大型超市:生鮮區的酸奶貼著"今日特價"標簽,促銷員定時檢查這些商品的保質期;而倉庫管理員正根據"先進先出"原則整理貨架,確保商品不會過期積壓。這種高效的商品管理策略,正是Redis處理過期數據和內存淘汰機制的完美比喻。

在實際開發中,我們經常遇到這樣的場景:用戶登錄會話7天后失效,熱點新聞緩存需要保留24小時,促銷活動數據在活動結束后需要自動清理。如果這些數據不及時清理,就會像超市積壓的過期商品一樣,占用寶貴的存儲空間,甚至導致系統崩潰。

根據我多年使用Redis的經驗,合理配置過期策略和淘汰策略是保證Redis高性能、高可用的關鍵。今天,我們就來深入探討Redis如何像高效的超市管理員一樣,智能管理數據生命周期。

一、Redis過期策略

理解了超市商品管理的比喻后,我們來看看Redis如何給數據貼上"保質期"標簽。

在實際工作中,我們經常會遇到需要設置數據有效期的場景:

  • 用戶驗證碼5分鐘有效、
  • API訪問令牌2小時有效
  • 每日排行榜在午夜重置。

Redis提供了兩種核心策略來管理這些過期數據,它們就像超市里的兩種質檢員,各有分工又相互配合。

1.1 定時刪除

定時刪除策略就像超市中負責臨期商品檢查的專員。當我們在Redis中設置一個鍵的過期時間時,Redis會創建一個定時器,在鍵過期時立即執行刪除操作。

# 設置鍵值對,并指定30秒后過期
SET user:session:1234 "user_data" EX 30# Redis內部會為這個鍵設置一個定時器
# 30秒后自動觸發刪除操作

上述代碼展示了如何設置帶有過期時間的鍵值對。EX參數指定過期時間(秒),Redis會為此鍵創建定時器,到期自動刪除。

📌 經驗分享: 根據我的觀察,定時刪除策略雖然實時性好,但會創建大量定時器。在高并發場景下,如果同時設置大量短期過期的鍵(比如短信驗證碼),可能對性能產生影響。我建議大家可以針對不同的業務場景選擇不同的策略。

1.2 惰性刪除

惰性刪除策略則像超市收銀員在結賬時檢查商品保質期。只有當客戶端嘗試訪問一個鍵時,Redis才會檢查該鍵是否過期,如果過期就立即刪除。

# 客戶端嘗試獲取一個可能過期的鍵
GET user:session:1234# Redis內部處理流程:
1. 檢查鍵是否存在
2. 如果存在,檢查是否過期
3. 如果過期,刪除鍵并返回nil
4. 如果未過期,返回值

1.3 定期刪除

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

Redis默認每100ms隨機抽取一定數量的鍵(默認20個)進行檢查:

  1. 隨機選擇20個設置過期時間的鍵
  2. 刪除其中已過期的鍵
  3. 如果過期鍵比例超過25%,重復步驟1

場景案例:電商平臺會話管理

假設場景: 一個大型電商平臺使用Redis存儲用戶會話,要求用戶登錄狀態保持30分鐘活躍期。

挑戰: 每天有數百萬用戶登錄,如果所有會話都使用定時刪除,會創建大量定時器;如果只用惰性刪除,可能積累大量過期會話占用內存。

解決方案: 考慮到實際業務需求和高并發場景,我們采用組合策略:

  • 對普通用戶會話使用惰性刪除+定期刪除組合
  • 對VIP用戶會話使用定時刪除,確保及時釋放資源
  • 配置定期刪除策略增加采樣數量

效果: 經過三個版本的迭代,我們發現內存使用減少35%,Redis CPU利用率下降20%,系統穩定性顯著提升。

二、Redis淘汰策略

掌握了數據保鮮的藝術后,我們面臨的下一個挑戰是:當超市貨架滿了,新商品該如何上架?同樣地,當Redis內存使用達到上限時,新數據寫入該如何處理?這就是淘汰策略要解決的問題。

在實際工作中,我們經常會遇到Redis內存不足的情況,特別是在處理突發流量或大數據量時。Redis提供了8種淘汰策略,就像超市有多種商品淘汰標準一樣,我們需要根據業務特點選擇最合適的策略。

2.1 淘汰策略全景圖

策略說明適用場景
noeviction不淘汰,新寫入操作報錯關鍵數據不能丟失的場景
allkeys-lru從所有鍵中淘汰最近最少使用的鍵通用場景,平衡性能
volatile-lru從設置過期時間的鍵中淘汰最近最少使用的鍵區分永久數據和臨時數據
allkeys-random從所有鍵中隨機淘汰所有鍵訪問概率均等
volatile-random從設置過期時間的鍵中隨機淘汰臨時數據隨機淘汰
volatile-ttl從設置過期時間的鍵中淘汰存活時間最短的鍵優先淘汰即將過期的數據
allkeys-lfu從所有鍵中淘汰最不經常使用的鍵熱點數據區分明顯的場景
volatile-lfu從設置過期時間的鍵中淘汰最不經常使用的鍵臨時數據中區分熱點數據

2.2 LRU與LFU算法深度解析

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

# Redis配置淘汰策略(redis.conf)
maxmemory 2gb
maxmemory-policy allkeys-lfu# 查看當前內存策略
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lfu"

上述配置設置Redis最大內存為2GB,并使用allkeys-lfu淘汰策略。通過CONFIG GET命令可以驗證當前配置。

?? 千萬要避免: 默認的noeviction策略在生產環境可能導致寫入失敗。我建議大家在項目上線前一定要檢查這個配置。

場景案例:新聞應用熱點排行榜

假設場景: 一個新聞應用使用Redis存儲熱點新聞排行榜,內存經常達到上限。

挑戰: 熱點新聞變化快,舊新聞需要及時淘汰,但突發新聞可能突然成為熱點。

解決方案: 考慮到實際業務中新聞熱點的變化模式,我們選擇了allkeys-lfu策略:

  • LFU算法能更好識別新熱點(訪問頻率高)
  • 配合過期時間設置(熱點新聞緩存24小時)
  • 監控LFU計數器,動態調整策略參數

效果: 使用LFU策略后,熱點新聞緩存命中率提升40%,冷門數據及時淘汰,內存使用穩定在安全閾值內。

三、實戰:配置與優化指南

理解了Redis的過期和淘汰策略后,我們來看看如何在實際項目中配置和優化。相信大家都對這個話題很感興趣,因為合理的配置能極大提升系統性能。

3.1 最佳配置實踐

根據我的經驗,不同業務場景需要不同的配置策略。下面是一些常見場景的建議:

# 電商平臺配置示例(redis.conf)
maxmemory 16gb
maxmemory-policy allkeys-lru
maxmemory-samples 10# 調整定期刪除策略頻率
hz 10 # 默認10,增加CPU使用但更及時清理

對于電商平臺,我們使用allkeys-lru策略并調整采樣數量。hz參數控制定期刪除的頻率,增加該值會更及時清理過期鍵,但會增加CPU使用。

3.2 監控與調優

在實際工作中,我們經常會遇到需要監控Redis內存使用的情況。我通常是這樣做的:

# 查看內存關鍵指標
127.0.0.1:6379> INFO memory# 重點關注:
used_memory:已使用內存
mem_fragmentation_ratio:內存碎片率
expired_keys:已過期的鍵總數
evicted_keys:被淘汰的鍵總數

💡 調優建議: 如果發現evicted_keys持續增長,說明淘汰頻繁,可能需要擴容或優化數據設計。如果expired_keys很高但used_memory不降,可能是定期刪除不夠及時,可以適當增加hz值。

場景案例:社交平臺Feed流緩存

假設場景: 社交平臺的用戶Feed流使用Redis緩存,每個用戶最新100條Feed。

挑戰: 用戶量巨大,活躍用戶Feed更新頻繁,內存壓力大。

解決方案: 考慮到實際用戶活躍模式和內存限制,我們采用多層策略:

  • 使用volatile-ttl策略,設置Feed數據1小時過期
  • 配合主動刷新機制,活躍用戶Feed提前刷新
  • 使用Redis模塊實現二級LRU鏈表管理

效果: 通過這個案例中的組合策略,內存使用減少50%,用戶訪問延遲降低30%,達到了高性能與資源平衡的效果。

總結與思考

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

  • 過期策略:定時刪除(精準但耗資源)、惰性刪除(高效但可能積累)、定期刪除(平衡之道)
  • 淘汰策略:8種策略適應不同場景,重點關注LRU和LFU算法差異
  • 配置實踐:根據業務特點選擇策略,監控關鍵指標持續優化

在實際工作中,沒有放之四海而皆準的策略。我建議大家可以多嘗試幾種方法,找到最適合自己業務場景的配置。根據我的經驗,合理的過期和淘汰策略配置可以使Redis性能提升30%-50%。

希望通過今天的分享,能幫助大家少走彎路。讓我們共同打造更高效的技術解決方案,歡迎隨時交流,一起分享Redis使用經驗!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84302.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

laravel8+vue3.0+element-plus搭建方法

創建 laravel8 項目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安裝 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …

【HarmonyOS 5】 影視與直播詳以及 開發案例

&#x1f3a5; ?一、超高清低延遲直播? ?4K/8K硬解能力?&#xff1a;通過鴻蒙媒體引擎實現15Mbps碼率視頻流穩定解碼&#xff0c;華為Pura X實測端到端延遲<80ms?分布式渲染?&#xff1a;支持手機拍攝→智慧屏導播→平板監看的工作流協同&#xff0c;設備間傳輸延遲&…

Tunna工具實戰:基于HTTP隧道的RDP端口轉發技術

工具概述 Tunna是一款利用HTTP/HTTPS隧道進行TCP通信的滲透測試工具&#xff0c;由SECFORCE團隊開發并開源。該工具主要應用于需要繞過防火墻限制的場景&#xff0c;通過Webshell實現內網服務的端口轉發&#xff0c;特別適合在僅開放80/443端口的環境中建立TCP連接。 項目地址…

c# Autorest解析

AutoRest 工具生成用于訪問 RESTful Web 服務的客戶端庫。AutoRest 的輸入是使用 OpenAPI 規范格式描述 REST API 的規范。OpenAPI(f.k.a Swagger)規范代碼生成器。支持 C#、PowerShell、Go、Java、Node.js、TypeScript、Python。 安裝 AutoRest 在 Windows、MacOS 或 Linux …

高中數學聯賽模擬試題精選學數學系列第24套幾何題

⊙ O 1 \odot O_1 ⊙O1? 和 ⊙ O 2 \odot O_2 ⊙O2? 交于 A A A, B B B. Y Y Y 是 ⊙ O 1 \odot O_1 ⊙O1? 上一點, Z Z Z 是 ⊙ O 2 \odot O_2 ⊙O2? 上一點&#xff0c; Y Z YZ YZ 通過 A A A. 過 Y Y Y 的 ⊙ O 1 \odot O_1 ⊙O1? 的切線和過 Z Z Z 的 ⊙…

【QT】INI格式文件讀寫類IniApi封裝

【QT】INI文件讀寫類IniApi封裝 前言實現INI文件寫入方法INI文件讀取方法 測試 前言 INI格式文件是一種純文本格式&#xff0c;使用方括[]定義節&#xff08;Section&#xff09;&#xff0c;每個節下包含鍵值對&#xff0c;如下圖所示。該格式文件簡單易讀易編輯。而且在所有…

ABAP設計模式之---“童子軍法則(The Boy Scout Rule)”

法則介紹 The Boy Scout Rule&#xff0c;中文一般翻譯為“童子軍法則”&#xff0c;是一個簡單卻非常有意義的軟件開發原則&#xff0c;它最早由軟件開發大師 Robert C. Martin (Uncle Bob) 在他的《Clean Code》一書中提出。 這條法則的核心思想非常簡單&#xff1a; “確保…

BaikalDB 架構演進實錄:打造融合向量化與 MPP 的 HTAP 查詢引擎

導讀 BaikalDB作為服務百度商業產品的分布式存儲系統&#xff0c;支撐了整個廣告庫海量物料的存儲和OLTP事務處理。隨著數據不斷增長&#xff0c;離線計算時效性和資源需求壓力突顯&#xff0c;基于同一份數據進行OLAP處理也更為經濟便捷&#xff0c;BaikalDB如何在OLTP系統內…

【抖音小程序】通用交易系統-下單問題整理

在通用交易系統中&#xff0c;支付流程如下 1、服務端-預下單&#xff1a;生成參數與簽名信息&#xff08;此過程不需要與抖音平臺對接&#xff09; 參考 生成下單參數與簽名_抖音開放平臺 2、小程序用戶端&#xff1a;根據返回的參數與簽名&#xff0c;拉起抖音支付&#x…

模型參數、模型存儲精度、參數與顯存

模型參數量衡量單位 M&#xff1a;百萬&#xff08;Million&#xff09; B&#xff1a;十億&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 參數存儲精度 模型參數是固定的&#xff0c;但是一個參數所表示多少字節不一定&#xff0c;需要看這個參數以什么…

EurekaServer 工作原理

一、核心工作流程 二、核心組件解析 1. 自動配置引擎 入口&#xff1a;EnableEurekaServer 引入 EurekaServerMarkerConfiguration&#xff0c;創建標記Bean Marker觸發條件&#xff1a;EurekaServerAutoConfiguration 檢測到 Marker 存在時激活關鍵Bean初始化&#xff1a; …

Playwright 與 Selenium:自動化測試的兩大主流工具對比

《Playwright 與 Selenium&#xff1a;自動化測試的兩大主流工具對比》 *Playwright 和 Selenium 是自動化測試領域的兩大主流工具&#xff0c;二者在架構設計、功能特性和適用場景上存在顯著差異&#xff0c;以下是核心對比&#xff1a; 一、架構與設計理念 維度Playwright…

網絡編程(Modbus進階)

思維導圖 Modbus RTU&#xff08;先學一點理論&#xff09; 概念 Modbus RTU 是工業自動化領域 最廣泛應用的串行通信協議&#xff0c;由 Modicon 公司&#xff08;現施耐德電氣&#xff09;于 1979 年推出。它以 高效率、強健性、易實現的特點成為工業控制系統的通信標準。 包…

R語言速釋制劑QBD解決方案之二

影響含量均一性的顯著因子&#xff08;%RSD&#xff09; 數據分析表明含量均一性的彎曲性不顯著。如半正態圖&#xff08;圖12&#xff09;所示&#xff0c;影響含量均一性的顯著因子為A&#xff08;原料藥粒徑&#xff09;和C&#xff08;MCC/Lactose&#xff09;。 mod2 <…

大模型原理、架構與落地

近年來&#xff0c;大模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;在人工智能領域迅猛發展&#xff0c;從GPT-3到GPT-4、Claude、Gemini、文心一言、GLM等模型相繼發布&#xff0c;大模型已逐漸走出實驗室&#xff0c;邁向產業落地。本文將從技術原理、…

WWDC 2025 macOS 26有哪些更新點

在2025年6月10日凌晨結束的WWDC 2025發布會中&#xff0c;蘋果正式發布了全新的macOS 26&#xff0c;并給其命名為Tahoe。 以下為macOS相關的主要內容&#xff1a; 命名方式改變 蘋果正式將各大系統的版本號改為對應年份&#xff0c;讓命名方式更直觀好記&#xff0c;macOS 2…

AI+預測3D新模型百十個定位預測+膽碼預測+去和尾2025年6月10日第104彈

從今天開始&#xff0c;咱們還是暫時基于舊的模型進行預測&#xff0c;好了&#xff0c;廢話不多說&#xff0c;按照老辦法&#xff0c;重點8-9碼定位&#xff0c;配合三膽下1或下2&#xff0c;殺1-2個和尾&#xff0c;再殺4-5個和值&#xff0c;可以做到100-300注左右。 (1)定…

.NET 8集成阿里云短信服務完全指南【短信接口】

文章目錄 前言一、準備工作1.1 阿里云賬號準備1.2 .NET 8項目創建 二、集成阿里云短信SDK2.1 安裝NuGet包2.2 配置阿里云短信參數2.3 創建配置類 三、實現短信發送服務3.1 創建短信服務接口3.2 實現短信服務3.3 注冊服務 四、創建控制器五、測試與優化5.1 單元測試5.2 性能優化…

解決HuggingFace不能git clone的問題

今天在從HuggingFace上clone項目的時候&#xff0c;一直出現超時問題&#xff0c;查了很多資料沒有解決&#xff0c;后來向mentor請教了一下&#xff0c;可以通過鏡像的方法解決這個問題&#xff0c;所以把方法放上來&#xff0c;希望對大家有幫助。 HuggingFace的服務器在國外…

Zookeeper 集群部署與故障轉移

Zookeeper 介紹 Zookeeper 是一個開源的分布式協調服務&#xff0c;由Apache基金會維護&#xff0c;專為分布式應用提供高可用、強一致性的核心基礎能力。它通過簡單的樹形命名空間&#xff08;稱為ZNode樹&#xff09;存儲數據節點&#xff08;ZNode&#xff09;&#xff0c;…