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

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

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

引言

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

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

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

1. 修改配置文件

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

2. 生效配置

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

二、引入 Redisson 依賴

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

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

三、配置 Redisson 連接 Redis 集群

Redisson 通過(guò)Config類配置集群連接,需指定節(jié)點(diǎn)地址、認(rèn)證信息及連接池參數(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") // 容器銷毀時(shí)關(guān)閉客戶端,釋放資源
    public RedissonClient redissonClient() {
        Config config = new Config();
        
        // 配置Redis集群(至少填寫一個(gè)主節(jié)點(diǎn)地址,Redisson會(huì)自動(dòng)發(fā)現(xiàn)其他節(jié)點(diǎn))
        config.useClusterServers()
              .addNodeAddress(
                  "redis://192.168.1.1:6379",
                  "redis://192.168.1.2:6379",
                  "redis://192.168.1.3:6379"
              )
              // 認(rèn)證配置
              .setPassword("your-redis-password") // 若集群?jiǎn)⒂妹艽a認(rèn)證
              .setUsername("default") // Redis 6.0+支持用戶名認(rèn)證,默認(rèn)留空
              
              // 連接池配置(根據(jù)業(yè)務(wù)壓力調(diào)整)
              .setMasterConnectionPoolSize(32) // 主節(jié)點(diǎn)連接池大小
              .setSlaveConnectionPoolSize(16)  // 從節(jié)點(diǎn)連接池大小
              .setIdleConnectionTimeout(30000) // 連接空閑超時(shí)(毫秒)
              
              // 集群特性配置
              .setScanInterval(2000) // 集群節(jié)點(diǎn)健康檢查間隔(毫秒)
              .setReadMode(ReadMode.SLAVE) // 讀操作路由到從節(jié)點(diǎn),減輕主節(jié)點(diǎn)壓力
              .setRetryAttempts(3) // 命令執(zhí)行失敗重試次數(shù)
              .setRetryInterval(1000); // 重試間隔(毫秒)
 
        return Redisson.create(config);
    }
}

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

  • destroyMethod = "shutdown":確保 Spring 容器銷毀時(shí),Redisson 客戶端優(yōu)雅關(guān)閉,避免連接泄漏。
  • ReadMode.SLAVE:非過(guò)期事件的讀操作可路由到從節(jié)點(diǎn),適合讀多寫少場(chǎng)景。
  • 連接池大小:根據(jù)并發(fā)量調(diào)整,建議主節(jié)點(diǎn)連接池不超過(guò) 64(避免 Redis 連接數(shù)過(guò)載)。
  • 配置文件配置如下
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"

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

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

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

適用于僅關(guān)注特定數(shù)據(jù)庫(kù)(如 DB 7)的場(chǎng)景,減少無(wú)關(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 的鍵過(guò)期事件
        RTopic topic = redissonClient.getTopic("__keyevent@7__:expired", StringCodec.INSTANCE);
 
        // 注冊(cè)監(jiān)聽器
        topic.addListener(String.class, new MessageListener<String>() {
            @Override
            public void onMessage(CharSequence channel, String msg) {
                //輸出過(guò)期的key 值
                System.out.println(msg);
            }
        });
 
    }
}

效果如下

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

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

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 的鍵過(guò)期事件
//        RTopic topic = redissonClient.getTopic("__keyevent@7__:expired", StringCodec.INSTANCE);
//        // 注冊(cè)監(jiān)聽器
//        topic.addListener(String.class, new MessageListener<String>() {
//            @Override
//            public void onMessage(CharSequence channel, String msg) {
//                //輸出過(guò)期的key 值
//                System.out.println(msg);
//            }
//        });
//    }
 
 
    @PostConstruct  // 初始化時(shí)訂閱事件
    public void listenExpireEvent() {
        // 訂閱所有數(shù)據(jù)庫(kù)的鍵過(guò)期事件(__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) {
                //輸出過(guò)期的key 值
                System.out.println(msg);
            }
        });
    }
}

效果如下

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

1. 為什么必須使用 StringCodec?

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

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

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

3. 性能與集群適配注意事項(xiàng)

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

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

相關(guān)文章

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

    Redis事務(wù)機(jī)制與Springboot項(xiàng)目中的使用方式

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

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

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

    基于Redis的ZSET實(shí)現(xiàn)用戶邀請(qǐng)排行榜

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

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

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

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

    本文主要介紹了redis-cli創(chuàng)建redis集群的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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í),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • redis批量刪除namespace下的數(shù)據(jù)的實(shí)現(xiàn)步驟

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

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

    Windows下安裝Redis的流程詳解

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

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

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

    redis發(fā)布訂閱_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

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

最新評(píng)論

宁城县| 泊头市| 辽宁省| 文登市| 永年县| 永顺县| 临夏市| 新化县| 临洮县| 屏南县| 郁南县| 湘乡市| 福建省| 渝北区| 修水县| 乃东县| 措勤县| 安泽县| 于田县| 西充县| 莲花县| 桐城市| 益阳市| 嘉善县| 惠来县| 电白县| 石城县| 五家渠市| 太仆寺旗| 宝鸡市| 新昌县| 罗甸县| 临桂县| 南昌县| 铜川市| 铁力市| 新竹县| 海南省| 库车县| 金坛市| 华池县|