Redis 過期了解

Redis 版本:5.0 :?

一:過期監聽:

Spring Data Redis 封裝了 Redis 的 Pub/Sub 功能,提供了對 key 過期事件的監聽支持。
1. 核心類:KeyExpirationEventMessageListener
這個抽象類是 Spring 提供的,專門用于監聽 Redis 的 key 過期事件。
代碼中的 RedisKeyExpiredListener 繼承自它

Redis 的 key 過期事件是一種發布/訂閱(Pub/Sub)機制,當某個設置了過期時間的 key 被 Redis 刪除時,Redis 會發布一個事件通知。Spring 通過監聽這些事件,并將其封裝為 Spring 事件模型中的對象,從而實現對 key 過期事件的捕獲和處理

Redis 的定期刪除策略是 默認每秒執行 10 次(即每 100 毫秒運行一次),這是由 Redis 配置中的 hz 參數控制的。

實際上:默認配置中,hz=10,表示每秒運行 10 次過期鍵清理任務。
每次運行時,Redis 會從數據庫中隨機選取一批設置了過期時間的鍵進行檢查,并刪除其中已過期的鍵。
這個過程不會掃描所有鍵,因此可能會有部分過期鍵在過期后不會立刻被刪除,導致“過期鍵延遲刪除”

可以在 redis.conf 文件中調整 hz 參數來改變 Redis 清理過期鍵的頻率:

增大 hz 值(例如設為 20 或 30)可以提高清理頻率,從而提升過期鍵的刪除實時性,但也會增加 CPU 消耗。
減小 hz 值則節省 CPU 資源,但可能導致更多的過期鍵滯留內存。?

實際操作也會遇到,手動更改了TTL方便更快過期,然后不刷新Redis Manager的情況下,盡管有定期刪除策略,也沒有收到那幾個key的過期監聽?

首先來認知原理:

Redis 使用兩種策略來處理設置了 TTL 的鍵(即有過期時間的鍵):

刪除策略觸發方式是否會觸發 expired 事件
惰性刪除(Lazy Expiration)key 被訪問時發現已過期但未被刪除(惰性刪除)? 會觸發 expired 事件
定期刪除(Active Expiration)Redis 每隔一段時間掃描并隨機刪除部分過期鍵? 不會觸發 expired 事件

public class RedisKeyExpiredListener extends KeyExpirationEventMessageListener


這個類繼承自 Spring Data Redis 提供的 KeyExpirationEventMessageListener。
它監聽的是 Redis 的 __keyevent@*:expired 通道。
只有當 Redis 通過惰性刪除觸發過期事件時,才會向這個通道發布消息,從而觸發你的 onMessage() 方法。?
如果一個 key 設置了過期時間(TTL),不主動訪問它,也沒有在過期后被 Redis 的惰性刪除機制觸發,那么你確實 可能永遠收不到 expired 過期通知。

疑問?

如果 Redis 通過定期刪除策略已經刪除了一個設置了 TTL 的 key,此時再去手動 GET 這個 key,還會觸發 Redis 的 expired 過期事件嗎?
答:不會觸發過期事件監聽器(如 RedisKeyExpiredListener)

只有在訪問一個 key 時,發現它已經過期但尚未被刪除的情況下,才會真正執行刪除操作,并觸發 expired 事件。
但如果這個 key 已經被 Redis 的定期刪除機制提前刪掉了:
它已經不存在于 Redis 中;此時你再訪問它(如 GET my_key),會直接返回 nil;
不會再次觸發 Redis 的過期檢查和事件通知。

二: 那么問題來了:什么是“查詢”key?什么又是“訪問”key?
2.1這是關鍵區分點 👇

操作是否算作“訪問”
GET key? 是
EXISTS key? 是
TTL key? 是
DEL key? 是
Redis 內部線程檢查 key 是否存在? 是
Redis 定期刪除時只是遍歷并比較過期時間? 不是

所以就是代碼中有對Redis進行不定時的設置復合鍵的key時,就會訪問key,這樣不用直接去手動get 此key,一樣是訪問到了

key格式復合鍵:TEST_KEY:

redisTemplate.opsForValue().set(TEST_KEY+ relatedId , null ,60, TimeUnit.SECONDS);

使用這類代碼,就是會導致,如果有進行定期set,就會訪問key,從而觸發一些過期key的過期監聽收到消息,

如果不進行設置,則一些已經過期的就有可能被定時刪除而收不到消息,導致消息丟失,數據不準確的問題

另外: Redis 定期刪除到底做了什么?

Redis 使用了一個叫做 activeExpireCycle() 的函數來執行定期刪除。
它的大致流程如下:

void activeExpireCycle(...) {// 獲取當前數據庫for (j = 0; j < dbs_per_call; j++) {for (k = 0; k < keys_per_call; k++) {// 隨機選取一個設置了 TTL 的 keyif (currentExpiresTime < now()) {// 直接刪除,不進行任何訪問操作dbDelete(db, key);}}}
}

關鍵點
Redis 只檢查 key 的過期時間;
沒有真正訪問這個 key 的內容(比如讀取、修改等);
所以 不會觸發惰性刪除邏輯;

自然也就 不會發布 expired 事件。

2.2? ?除了上面說的情況,某些 key 即使沒手動 get,也被監聽到過期事件?

模塊行為是否可能訪問 key
Lua 腳本EVAL 中使用 key? 是
集群遷移MIGRATE 命令? 是
持久化RDB 快照生成時? 否
主從同步復制 key 到從節點? 否
慢日志記錄慢命令? 否
其他業務模塊如緩存統計、監控工具? 是

所以你雖然沒有顯式調用 get(key),但這些模塊可能會在你不察覺的情況下訪問 key,從而觸發惰性刪除。

三:Redis 淘汰策略中訪問到這個 key

場景是否觸發 expired 事件
Redis 定期刪除直接刪掉了這個 key? 否
Redis 主從同步時訪問了這個 key? 是
Redis 集群遷移該 key 到新節點? 是
Redis 慢日志記錄了訪問該 key 的命令? 是(說明它已經被訪問)
Redis 監控工具周期性檢查 key? 是
Redis 淘汰策略中訪問到這個 key? 是

所以,你的 key 是如何被訪問到的?

機制是否可能訪問 key
Redisson 的 RLock、RLock.tryLock()? 是
Spring Cacheable 緩存組件? 是
Redis 的 SCAN 命令? 是
Redis 的 KEYS * 命令? 是
Redis 的 EXPIRE 命令? 是
Redis 的 DEL 命令? 是

這些命令雖然你不寫,但 Redis 內部模塊或框架庫可能會使用它們。

?四:使用 Redisson 的延遲隊列(推薦)

RDelayedQueue<String> queue = redisson.getDelayedQueue(redisson.getQueue("my_queue"));
queue.offer("data", 60, TimeUnit.SECONDS);// 注冊監聽器
queue.registerListener(item -> {log.info("收到延遲消息: {}", item);
});

這種方式比依賴 Redis 的 expired 事件更加穩定可靠。

Redis 內部模塊和后臺任務 可能 會訪問你的 key,但這不是一定會發生的行為。
所以你看到的 key 過期事件,是 “可能觸發”的結果,而不是“一定會觸發”的機制。
如果你需要確保 key 過期后觸發回調,請使用 Redisson 的延遲隊列 或 Kafka + 定時輪詢 等更可靠的機制。

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

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

相關文章

OA工程自動化辦公系統 – 免費Java源碼

概述 功能完備的OA工程自動化辦公系統Java源碼&#xff0c;采用主流技術棧開發&#xff0c;無論是學習SpringBoot框架還是開發企業級應用&#xff0c;都是不可多得的優質資源。 主要內容 技術架構 ??后端技術棧??&#xff1a; 核心框架&#xff1a;SpringBoot 2.xORM框…

嵌入式SDK技術EasyRTC音視頻實時通話助力即時通信社交/教育等多場景創新應用

一、引言? 在數字化時代&#xff0c;即時通信已成為人們生活和工作中不可或缺的部分。音視頻功能作為即時通信的核心&#xff0c;能實現更加直觀、高效的信息傳遞。EasyRTC作為一款強大的實時通信框架&#xff0c;具備諸多優勢&#xff0c;為即時通信的音視頻應用提供了優質解…

BEV和OCC學習-5:數據預處理流程

參考&#xff1a;自定義數據預處理流程 — MMDetection3D 1.4.0 文檔 數據預處理流程的設計 預處理流程中的各項操作主要分為數據加載、預處理、格式化、測試時的數據增強。 接下來將展示一個用于 PointPillars 模型的數據集預處理流程的例子。 train_pipeline [dict(type…

OGG 23ai for DAA 部署與補丁升級

創建ogg 用戶 /usr/sbin/groupadd -g 1002 dba /usr/sbin/groupadd -g 1001 oinstall /usr/sbin/groupadd -g 1003 oper useradd -u 1001 -g oinstall -G dba,oper oracle echo "oracle" |passwd oracle --stdin創建ogg安裝目錄 mkdir -p /u01/app/ogg/soft mkdir …

【LangchainAgent】Agent基本構建與使用

目錄 一、功能簡述 代碼功能概括 &#x1f3af; 核心能力 二、運作流程 三、核心代碼 四、運行結果 五、代碼功能拆解 ? 1. 環境準備與依賴導入 ? 2. 加載網頁文檔并處理為向量 ? 3. 創建檢索工具與搜索工具 ? 4. 初始化語言模型與 Agent ? 5. 封裝支持多輪記…

【云安全】以Aliyun為例聊云廠商服務常見利用手段

目錄 OSS-bucket_policy_readable OSS-object_public_access OSS-bucket_object_traversal OSS-Special Bucket Policy OSS-unrestricted_file_upload OSS-object_acl_writable ECS-SSRF 云攻防場景下對云廠商服務的利用大同小異&#xff0c;下面以阿里云為例 其他如騰…

完成一個可交互的k8s管理平臺的頁面開發

使用deepseek完成設計一個k8s管理平臺&#xff0c;關鍵詞如下&#xff1a; 完成一個可交互的k8s管理平臺的頁面開發Kubernetes 管理平臺頁面設計 下面是一個基于現代Web技術的可交互Kubernetes管理平臺的頁面設計方案&#xff0c;使用React作為前端框架&#xff0c;配合Ant De…

TDengine 支持的平臺匯總

TDengine 服務端支持的平臺列表 注&#xff1a;1) ● 表示經過官方測試驗證&#xff0c; ○ 表示非官方測試驗證&#xff0c;E 表示僅企業版支持。 2) 社區版僅支持主流操作系統的較新版本&#xff0c;包括 Ubuntu 18/CentOS 7/CentOS Stream/RedHat/Debian/CoreOS/FreeBSD/Op…

使用 HTML + JavaScript 實現文章逐句高亮朗讀功能

在這個信息爆炸的時代&#xff0c;我們每天都要面對大量的文字閱讀。無論是學習、工作還是個人成長&#xff0c;閱讀都扮演著至關重要的角色。然而&#xff0c;在快節奏的生活中&#xff0c;我們往往難以找到足夠的安靜時間專注于閱讀。本文用 HTML JavaScript 實現了一個基于…

理解非結構化文檔:將 Reducto 解析與 Elasticsearch 結合使用

作者&#xff1a;來自 Elastic Adel Wu 演示如何將 Reducto 的文檔處理與 Elasticsearch 集成以實現語義搜索。 Elasticsearch 與業界領先的生成式 AI 工具和提供商有原生集成。歡迎觀看我們的網絡研討會&#xff0c;了解如何超越 RAG 基礎&#xff0c;或使用 Elastic 向量數據…

從Copilot到Agent,AI Coding是如何進化的?

編程原本是一項具有一定門檻的技能&#xff0c;但借助 AI Coding 產品&#xff0c;新手也能寫出可運行的代碼&#xff0c;非專業人員如業務分析師、產品經理&#xff0c;也能在 AI 幫助下直接生成簡單應用。 這一演變對軟件產業產生了深遠影響。當 AI 逐步參與代碼生成、調試乃…

UGUI Text/TextMeshPro字體組件

UGUI Text組件的不當使用及其性能瓶頸與優化 在Unity UGUI系統中&#xff0c;Text 組件&#xff08;或其升級版 TextMeshPro&#xff09;是顯示文本信息的核心元素。然而&#xff0c;如果不當使用&#xff0c;它極易成為UI性能瓶頸的罪魁禍首&#xff0c;尤其是在預制體、屬性…

淺談 React Hooks

React Hooks 是 React 16.8 引入的一組 API&#xff0c;用于在函數組件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通過簡潔的函數接口&#xff0c;解決了狀態與 UI 的高度解耦&#xff0c;通過函數式編程范式實現更靈活 Rea…

【個人筆記】數據庫原理(西電)

寫在前面&#xff1a;文中提到的頁面指向&#xff08;如“p45”&#xff09;&#xff0c;除特別說明&#xff0c;都是指對應ppt上的頁面&#xff0c;非同款ppt的友友可忽略 第一章 ER圖和關系分解見課本p69 ER圖是常用的 概念模型 方形&#xff1a;實體圓形&#xff1a;屬性…

SDC命令詳解:使用set_propagated_clock命令進行約束

相關閱讀 SDC命令詳解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目錄 指定端口列表/集合 簡單使用 注意事項 傳播時鐘是在進行了時鐘樹綜合后&#xff0c;使用set_propagated_clock命令可以將一個理想時鐘轉換為傳播時鐘&#x…

關于華為倉頡編程語言

文章目錄 一、基本概況二、技術特點1. 多范式編程2. 原生智能化3. 高性能與安全4. 全場景兼容 三、編譯器與開發工具四、語言相似性對比五、行業應用實例總結 最近經常看到這個東西&#xff0c;于是搜了一下&#xff0c;整理了一些內容&#xff0c;水一篇&#xff0c;以后慢慢研…

【STM32F1標準庫】理論——定時器中的輸出比較

目錄 一、定時器的輸出比較介紹&#xff08;Output Compare&#xff09; 1.整體簡介 2.輸出比較單元具體功能框圖 3.以PWM模式1舉例 二、雜談 1.CCR的全名 2.PWM簡介 3.舵機簡介 4.直流電機及驅動模塊TB6612簡介 一、定時器的輸出比較介紹&#xff08;Output Compare…

前端開發面試題總結-HTML篇

文章目錄 HTML面試高頻問答一、HTML 的 src 和 href 屬性有什么區別?二、什么是 HTML 語義化?三、HTML的 script 標簽中 defer 和 async 有什么區別?四、HTML5 相比于 HTML有哪些更新?五、HTML行內元素有哪些? 塊級元素有哪些? 空(void)元素有哪些?六、iframe有哪些優點…

Scrapy爬蟲教程(新手)

1. Scrapy的核心組成 引擎&#xff08;engine&#xff09;&#xff1a;scrapy的核心&#xff0c;所有模塊的銜接&#xff0c;數據流程梳理。 調度器&#xff08;scheduler&#xff09;&#xff1a;本質可以看成一個集合和隊列&#xff0c;里面存放著一堆即將要發送的請求&#…

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型時序預測

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型時序預測 目錄 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型時序預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五…