最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過Redisson監(jiān)聽Redis集群的Key過期事件的實現(xiàn)指南

 更新時間:2025年11月09日 14:09:44   作者:非ban必選  
在分布式系統(tǒng)中,監(jiān)聽 Redis 鍵過期事件是實現(xiàn)緩存失效、訂單超時取消等功能的常用方案,本文將詳細介紹如何通過 Redisson 高效監(jiān)聽 Redis 集群的 Key 過期事件,需要的朋友可以參考下

引言

在分布式系統(tǒng)中,監(jiān)聽 Redis 鍵過期事件是實現(xiàn)緩存失效、訂單超時取消等功能的常用方案。本文將詳細介紹如何通過 Redisson 高效監(jiān)聽 Redis 集群的 Key 過期事件,包含環(huán)境配置、代碼實現(xiàn)及最佳實踐,適用于生產(chǎn)環(huán)境落地。

一、前置條件:開啟 Redis 集群的鍵過期通知

Redis 默認關(guān)閉鍵事件通知,需在所有集群節(jié)點的配置文件(redis.conf)中開啟過期事件監(jiān)聽,確保事件能被正確觸發(fā):

1. 修改配置文件

# 開啟鍵過期事件通知(E表示鍵事件,x表示過期事件)
notify-keyspace-events Ex
  • 配置說明:notify-keyspace-events參數(shù)用于指定監(jiān)聽的事件類型,Ex組合表示僅監(jiān)聽鍵過期事件(減少不必要的事件推送,提升性能)。

2. 生效配置

  • 若 Redis 已啟動,可通過命令臨時生效(重啟后失效):
# 連接任意集群節(jié)點執(zhí)行
redis-cli -h 192.168.1.1 -p 6379 config set notify-keyspace-events Ex
  • 生產(chǎn)環(huán)境建議修改配置文件后重啟集群,確保配置持久化。

二、引入 Redisson 依賴

Redisson 提供了對 Redis 集群的原生支持,通過 Spring Boot Starter 可快速集成:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.52.0</version>
</dependency>

三、配置 Redisson 連接 Redis 集群

Redisson 通過Config類配置集群連接,需指定節(jié)點地址、認證信息及連接池參數(shù),確保高可用:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.ReadMode;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class RedissonClusterConfig {
 
    @Bean(destroyMethod = "shutdown") // 容器銷毀時關(guān)閉客戶端,釋放資源
    public RedissonClient redissonClient() {
        Config config = new Config();
        
        // 配置Redis集群(至少填寫一個主節(jié)點地址,Redisson會自動發(fā)現(xiàn)其他節(jié)點)
        config.useClusterServers()
              .addNodeAddress(
                  "redis://192.168.1.1:6379",
                  "redis://192.168.1.2:6379",
                  "redis://192.168.1.3:6379"
              )
              // 認證配置
              .setPassword("your-redis-password") // 若集群啟用密碼認證
              .setUsername("default") // Redis 6.0+支持用戶名認證,默認留空
              
              // 連接池配置(根據(jù)業(yè)務(wù)壓力調(diào)整)
              .setMasterConnectionPoolSize(32) // 主節(jié)點連接池大小
              .setSlaveConnectionPoolSize(16)  // 從節(jié)點連接池大小
              .setIdleConnectionTimeout(30000) // 連接空閑超時(毫秒)
              
              // 集群特性配置
              .setScanInterval(2000) // 集群節(jié)點健康檢查間隔(毫秒)
              .setReadMode(ReadMode.SLAVE) // 讀操作路由到從節(jié)點,減輕主節(jié)點壓力
              .setRetryAttempts(3) // 命令執(zhí)行失敗重試次數(shù)
              .setRetryInterval(1000); // 重試間隔(毫秒)
 
        return Redisson.create(config);
    }
}

關(guān)鍵配置說明:

  • destroyMethod = "shutdown":確保 Spring 容器銷毀時,Redisson 客戶端優(yōu)雅關(guān)閉,避免連接泄漏。
  • ReadMode.SLAVE:非過期事件的讀操作可路由到從節(jié)點,適合讀多寫少場景。
  • 連接池大?。焊鶕?jù)并發(fā)量調(diào)整,建議主節(jié)點連接池不超過 64(避免 Redis 連接數(shù)過載)。
  • 配置文件配置如下
spring:
  datasource:
    druid:
      password: xxxxxxx
      url: jdbc:mysql://127.0.0.1:3306/service?useUnicode=true&allowMultiQueries=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
      username: root
  redis:
    redisson:
      file: classpath:redisson-clu.yaml
  • redisson-clu.yaml
clusterServersConfig:
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  failedSlaveReconnectionInterval: 3000
  failedSlaveCheckInterval: 60000
  password: xxxxxxx
  subscriptionsPerConnection: 5
  clientName: null
  loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
  subscriptionConnectionMinimumIdleSize: 1
  subscriptionConnectionPoolSize: 50
  slaveConnectionMinimumIdleSize: 24
  slaveConnectionPoolSize: 64
  masterConnectionMinimumIdleSize: 24
  masterConnectionPoolSize: 64
  readMode: "SLAVE"
  subscriptionMode: "SLAVE"
  nodeAddresses:
  - "redis://127.0.0.1:6380"
  - "redis://127.0.0.1:6381"
  - "redis://127.0.0.1:6382"
  - "redis://127.0.0.1:6383"
  - "redis://127.0.0.1:6384"
  - "redis://127.0.0.1:6385"
  scanInterval: 1000
  pingConnectionInterval: 0
  keepAlive: false
  tcpNoDelay: false
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"

四、實現(xiàn) Key 過期事件監(jiān)聽器

Redisson 提供兩種訂閱方式:RTopic(指定數(shù)據(jù)庫)和RPatternTopic(通配符訂閱),需結(jié)合StringCodec解析事件消息(Redis 過期事件的消息為鍵名字符串)。

方式 1:監(jiān)聽指定數(shù)據(jù)庫的過期事件(精確訂閱)

適用于僅關(guān)注特定數(shù)據(jù)庫(如 DB 7)的場景,減少無關(guān)事件干擾:

package com.yh.service.config;
 
import org.redisson.api.RPatternTopic;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.redisson.api.listener.MessageListener;
import org.redisson.api.listener.PatternMessageListener;
import org.redisson.client.codec.StringCodec;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import javax.annotation.PostConstruct;
 
@Component
public class RedisKeyExpireListener {
 
    @Autowired
    private RedissonClient redissonClient;
    
 
    @PostConstruct
    public void listenExpireEvent1() {
        // 僅監(jiān)聽 DB 7 的鍵過期事件
        RTopic topic = redissonClient.getTopic("__keyevent@7__:expired", StringCodec.INSTANCE);
 
        // 注冊監(jiān)聽器
        topic.addListener(String.class, new MessageListener<String>() {
            @Override
            public void onMessage(CharSequence channel, String msg) {
                //輸出過期的key 值
                System.out.println(msg);
            }
        });
 
    }
}

效果如下

方式 2:監(jiān)聽所有數(shù)據(jù)庫的過期事件(通配符訂閱)

適用于需要監(jiān)聽集群中所有數(shù)據(jù)庫過期事件的場景,通過通配符*匹配所有數(shù)據(jù)庫:

package com.yh.service.config;
 
import org.redisson.api.RPatternTopic;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.redisson.api.listener.MessageListener;
import org.redisson.api.listener.PatternMessageListener;
import org.redisson.client.codec.StringCodec;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import javax.annotation.PostConstruct;
 
@Component
public class RedisKeyExpireListener {
 
    @Autowired
    private RedissonClient redissonClient;
 
 
//    @PostConstruct
//    public void listenExpireEvent1() {
//        // 僅監(jiān)聽 DB 7 的鍵過期事件
//        RTopic topic = redissonClient.getTopic("__keyevent@7__:expired", StringCodec.INSTANCE);
//        // 注冊監(jiān)聽器
//        topic.addListener(String.class, new MessageListener<String>() {
//            @Override
//            public void onMessage(CharSequence channel, String msg) {
//                //輸出過期的key 值
//                System.out.println(msg);
//            }
//        });
//    }
 
 
    @PostConstruct  // 初始化時訂閱事件
    public void listenExpireEvent() {
        // 訂閱所有數(shù)據(jù)庫的鍵過期事件(__keyevent@*__:expired)
        RPatternTopic topic = redissonClient.getPatternTopic("__keyevent@*__:expired",StringCodec.INSTANCE);
 
        // 添加消息監(jiān)聽器
        topic.addListener(String.class,new PatternMessageListener<String>() {
            @Override
            public void onMessage(CharSequence pattern, CharSequence channel, String msg) {
                //輸出過期的key 值
                System.out.println(msg);
            }
        });
    }
}

效果如下

五、關(guān)鍵技術(shù)細節(jié)與最佳實踐

1. 為什么必須使用 StringCodec?

Redis 的過期事件消息內(nèi)容是原始鍵名字符串(如order:123),而 Redisson 默認使用JsonJacksonCodec(JSON 解析)。若不指定StringCodec,會導(dǎo)致 JSON 解析錯誤(如JsonParseException: Unrecognized token 'order'),因此必須顯式指定字符串編碼器。

2. 如何保證事件處理的可靠性?

  • 異步處理:監(jiān)聽器的onMessage方法運行在 Redisson 的 Netty IO 線程中,需通過線程池異步執(zhí)行業(yè)務(wù)邏輯,避免阻塞事件監(jiān)聽。
  • 防止丟失:Redis 事件通知是 “fire and forget” 模式,監(jiān)聽器宕機期間的事件會丟失。關(guān)鍵業(yè)務(wù)需結(jié)合:
    • 定時任務(wù)兜底(如每 10 分鐘掃描超時訂單);
    • 事件持久化(監(jiān)聽到事件后先存入 Redis Stream/Kafka,再消費處理)。
  • 冪等性設(shè)計:同一事件可能因集群主從切換被重復(fù)推送,需確保業(yè)務(wù)邏輯冪等(如處理前檢查訂單狀態(tài))。

3. 性能與集群適配注意事項

  • 集群事件路由:Redis 集群中,鍵過期事件會在鍵所在的節(jié)點觸發(fā),Redisson 會自動訂閱所有節(jié)點的事件,無需額外配置。
  • 連接池隔離:業(yè)務(wù)線程池需與 Redisson 的內(nèi)部線程池隔離,避免業(yè)務(wù)阻塞影響 Redis 連接。
  • 事件過濾:通過鍵名前綴(如order:)過濾無關(guān)事件,減少無效處理。
  • 監(jiān)控告警:添加 metrics 監(jiān)控(如事件總數(shù)、處理成功率),結(jié)合告警機制及時發(fā)現(xiàn)異常。

以上就是通過Redisson監(jiān)聽Redis集群的Key過期事件的實現(xiàn)指南的詳細內(nèi)容,更多關(guān)于Redisson監(jiān)聽Redis Key過期事件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis事務(wù)機制與Springboot項目中的使用方式

    Redis事務(wù)機制與Springboot項目中的使用方式

    Redis事務(wù)機制允許將多個命令打包在一起,作為一個原子操作來執(zhí)行,開啟事務(wù)使用MULTI命令,執(zhí)行事務(wù)使用EXEC命令,取消事務(wù)使用DISCARD命令,監(jiān)視一個或多個鍵使用WATCH命令,Redis事務(wù)的核心思想是將多個命令放入一個隊列中
    2025-03-03
  • Redis操作相關(guān)命令之查看、停止、啟動命令

    Redis操作相關(guān)命令之查看、停止、啟動命令

    這篇文章主要介紹了Redis操作相關(guān)命令之查看、停止、啟動命令,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 基于Redis的ZSET實現(xiàn)用戶邀請排行榜

    基于Redis的ZSET實現(xiàn)用戶邀請排行榜

    本文主要介紹了在項目中實現(xiàn)用戶邀請功能并基于積分進行排名的解決方案,使用了Redis的ZSET數(shù)據(jù)結(jié)構(gòu)和Redisson的RLock進行加鎖以避免并發(fā)問題,感興趣的可以了解一下
    2025-11-11
  • 利用Redis的有序集合實現(xiàn)排行榜功能實例代碼

    利用Redis的有序集合實現(xiàn)排行榜功能實例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Redis的有序集合實現(xiàn)排行榜功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • redis-cli創(chuàng)建redis集群的實現(xiàn)

    redis-cli創(chuàng)建redis集群的實現(xiàn)

    本文主要介紹了redis-cli創(chuàng)建redis集群的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí)

    Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí)

    這篇文章主要為大家介紹了Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • redis批量刪除namespace下的數(shù)據(jù)的實現(xiàn)步驟

    redis批量刪除namespace下的數(shù)據(jù)的實現(xiàn)步驟

    在開發(fā)中為了更好的管理數(shù)據(jù),對redis進行了分組存儲操作,在存值時加了命名空間來實現(xiàn),本文就來介紹一下redis批量刪除namespace下的數(shù)據(jù)的實現(xiàn)步驟,感興趣的可以了解一下
    2025-12-12
  • Windows下安裝Redis的流程詳解

    Windows下安裝Redis的流程詳解

    Redis作為常用開源的非關(guān)系型數(shù)據(jù)庫,是開發(fā)中常用的數(shù)據(jù)庫之一,很多朋友不清楚Windows下安裝Redis的過程,今天小編通過分享本文給大家介紹詳細過程,一起看看吧
    2021-08-08
  • redis數(shù)據(jù)結(jié)構(gòu)之String詳解

    redis數(shù)據(jù)結(jié)構(gòu)之String詳解

    Redis以String為基礎(chǔ)類型,因C字符串效率低、非二進制安全等問題,采用SDS動態(tài)字符串實現(xiàn)高效存儲,通過RedisObject封裝,支持多種編碼方式(如RAW、EMBSTR、INT)和內(nèi)存優(yōu)化策略,靈活管理數(shù)據(jù)結(jié)構(gòu)與內(nèi)存使用
    2025-08-08
  • redis發(fā)布訂閱_動力節(jié)點Java學(xué)院整理

    redis發(fā)布訂閱_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了redis發(fā)布訂閱,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論

武川县| 禄丰县| 民权县| 江油市| 北宁市| 泰宁县| 兴宁市| 清远市| 南木林县| 吉安县| 哈尔滨市| 边坝县| 慈利县| 怀宁县| 乌拉特中旗| 航空| 朝阳区| 乌恰县| 株洲县| 本溪市| 邓州市| 绥中县| 秭归县| 寻甸| 平阴县| 伊宁市| 合肥市| 兴业县| 民和| 阳曲县| 青川县| 闽清县| 东安县| 蓬溪县| 泰兴市| 临沂市| 安陆市| 宁化县| 东乡族自治县| 大足县| 呈贡县|