Redis发布订阅在Java中使用Redisson如何配置_利用Redisson高级特性简化开发

轻宇酱_6586

轻宇酱_6586

2026-04-29

783人浏览

原创

rtopic不支持自动重连与消息持久化,断网后监听器静默失效,因其依赖redis原生无状态pub/sub;需手动实现连接监控、重订阅及缓冲,或改用rstream保障可靠性。

redis发布订阅在java中使用redisson如何配置_利用redisson高级特性简化开发

Redisson 的发布订阅不是开箱即用的“自动重连+消息不丢”方案,它默认不保证离线期间的消息可达,也不自动重订阅;想靠 RTopic 实现可靠通知,必须手动补足重连、重订阅、本地缓冲等逻辑。

为什么 RTopic.addListener() 在断网后收不到新消息

Redisson 的 RTopic 订阅基于底层 Redis Pub/Sub 连接,该连接是短生命周期的:一旦网络中断或 Redis 重启,连接断开,RTopic 不会自动重建订阅关系,也不会回溯历史消息(Redis Pub/Sub 本身无消息持久化)。

  • 现象:addListener() 注册的监听器在 Redis 临时不可达后彻底静默,无异常抛出,也无回调触发
  • 根本原因:Redisson 默认使用 SingleServerConfig 或 ClusterServersConfig 中的 subscriptionConnectionPoolSize 和 subscriptionConnectionMinimumIdleSize 管理订阅连接池,但不监控连接有效性,也不触发自动重订阅
  • 解决方向:必须监听 RedissonClient 的连接状态,并在连接恢复后主动调用 RTopic.removeListener() + RTopic.addListener() 重建监听

如何让 RTopic 支持断线重连后的自动重订阅

Redisson 没有内置“auto-resubscribe”开关,需结合 RedisPubSubListener 和客户端生命周期事件手动实现:

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
  • 用 redisson.getCodec().getMapCacheCodec() 或自定义 codec 确保序列化兼容(尤其跨服务版本时)
  • 监听 RedissonClient 的 addListener(RedisNodeNotFoundException.class, ...) 和 addListener(ConnectionWatchdog.class, ...) 类事件(需反射获取或依赖 Redisson 内部事件机制)
  • 更稳妥做法:启动时启动一个后台线程,定期调用 redisson.getNodesGroup().pingAll(),失败时清空本地 RTopic 缓存并重新 getTopic(...).addListener(...)
  • 示例关键片段:
    RTopic topic = redisson.getTopic("alarm:channel");
    topic.addListener(String.class, (channel, msg) -> System.out.println("received: " + msg));
    // 后续需自行维护该 topic 引用,并在网络恢复后重新 addListener

RTopic 和 RStream 到底该选哪个

如果业务要求“至少一次投递”或需要消费组、消息确认、未读消息回溯,RTopic 从设计上就不适用——它只是对 Redis 原生 Pub/Sub 的封装;此时应直接切到 RStream(Redis 5.0+ Stream 数据结构 + Redisson 封装):

  • RTopic:适合实时性高、可容忍丢失的场景,如服务心跳广播、配置刷新通知
  • RStream:支持消费者组(RStream.readGroup())、pending list、ACK 机制;消息写入即持久化,断线重连后可拉取未 ACK 消息
  • 注意:RStream 需 Redis 服务端开启 AOF 或 RDB 持久化,否则重启后 stream 数据丢失;而 RTopic 即使开了 AOF 也无法持久化 Pub/Sub 消息
  • 迁移成本:改用 RStream 需调整生产者调用 rstream.add(),消费者改用 readGroup() + acknowledge(),无法与原有 RTopic 兼容

监听器里做耗时操作会导致什么

RTopic 的监听器默认运行在 Netty EventLoop 线程中,若在回调里执行数据库查询、HTTP 调用或锁等待,会阻塞整个订阅连接的事件处理,轻则延迟接收新消息,重则触发连接超时断开:

  • 典型错误:topic.addListener(..., (c,m) -> userDao.saveLog(m)) —— 直接在监听线程里写 DB
  • 正确做法:用 CompletableFuture.runAsync(() -> {...}, executor) 拆出异步线程池,或改用 RTopic.addListenerAsync()(仅 Redisson 3.23.0+ 支持,且仍需注意线程上下文传递)
  • 务必限制自定义线程池大小(如 new ThreadPoolExecutor(4, 8, 60, TimeUnit.SECONDS, new SynchronousQueue())),避免突发流量打爆 JVM

真正难的不是写通 RTopic,而是判断它是否真的适合你的场景——很多团队踩坑后才发现,所谓“实时通知”,其实隐含了“不能丢”“要有序”“得可追溯”等需求,而这些恰恰是 Redis Pub/Sub 天然不提供的。别被 addListener 的简洁语法骗了,先想清楚语义,再选 API。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java redis

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4589

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4155

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7792

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7782

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1156

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6778

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习