Redisson发布订阅学习

介绍

Redisson 的消息订阅功能遵循 Redis 的发布/订阅模式,该模式包括以下几个核心概念:

  • 发布者(Publisher):发送消息到特定频道的客户端。在 Redis 中,这通过 PUBLISH 命令实现。

  • 订阅者(Subscriber):监听频道并接收消息的客户端。Redis 提供了 SUBSCRIBE 命令来实现订阅功能。

  • 频道(Channel):消息传递的媒介。发布者和订阅者通过频道进行通信。

  • 消息(Message):通过频道从发布者传递到订阅者的数据。

Redisson 对 Redis 的发布/订阅机制进行了封装,提供了更易于使用的 Java API。具体实现如下:

  • 发布消息(Publish):当一个客户端想要发送消息时,它使用 Redis 的 PUBLISH 命令将消息发送到特定的频道。Redisson 提供了 RTopic 接口来实现这一功能。例如:

RTopic topic = redisson.getTopic("testTopic");
topic.publish("Hello, World!");
  • 订阅消息(Subscribe):另一端的客户端使用 Redis 的 SUBSCRIBE 命令订阅一个或多个频道。当有消息发送到这些频道时,Redis 会自动将消息推送给所有订阅者。Redisson 提供了 addListener 方法来添加消息监听器。例如:
topic.addListener(String.class, new MessageListener<String>() {@Overridepublic void onMessage(CharSequence channel, String msg) {System.out.println("Received message from " + channel + ": " + msg);}
});
 消息处理

Redisson 为 RTopic 实现了监听器接口,允许应用程序定义如何处理接收到的消息。当消息到达时,Redisson 会调用这些监听器。例如,可以在 onMessage 方法中处理消息,或者在处理过程中捕获异常并进行适当的兜底策略。

优点
  • 解耦:发布者和订阅者之间不需要知道对方,可以独立进行扩展和修改。

  • 简单易用:Redisson 提供了简单的 API 来进行消息的发布和订阅,开发者可以轻松集成到自己的应用中。

  • 实时性:Redis 的发布/订阅机制提供了低延迟的消息传递,适合需要实时通信的应用。

  • 可扩展性:可以有多个订阅者同时订阅同一个主题,而且可以通过增加 Redis 实例来水平扩展系统。

  • 高吞吐量:Redis 作为内存数据结构存储,能够处理大量的消息。

 缺点
  • 消息丢失

    Redis 的 Pub/Sub 是即时的,如果订阅者不在线,消息会丢失。如果需要消息持久化,可以考虑使用 Redis Stream。
  • 网络断开

    如果客户端与 Redis 服务器的连接断开,需要重新订阅频道。
  • 性能问题

    如果订阅的频道过多或消息量过大,可能会影响 Redis 服务器的性能。

代码示例

添加依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.15.6</version> 
</dependency>
初始化 Redisson 客户端
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonConfig {public static RedissonClient createRedissonClient() {Config config = new Config();config.useSingleServer()//Redis 服务器地址.setAddress("redis://127.0.0.1:6379")//密码.setPassword("password") .setKeepAlive(true);return Redisson.create(config);}}
创建消息发布者
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.redisson.api.listener.MessageListener;
import org.springframework.stereotype.Component;@Slf4j
@Component
@AllArgsConstructor
public class MessagePublisher {private RedissonClient redissonClient;public void publishMessage(String topicName, String message) {RTopic topic = redissonClient.getTopic(topicName);topic.publish(message);}
}
创建消息订阅者
import lombok.AllArgsConstructor;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;@Component
@AllArgsConstructor
public class DemoMessagePublisher{private RedissonClient redissonClient;public void publishMessage(String topicName, String message) {RTopic topic = redissonClient.getTopic(topicName);topic.publish(message);}}
消息绑定
import com.jlcloud.tenant.mq.listener.TenantMessageListener;
import lombok.AllArgsConstructor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class MessageTestRunner implements CommandLineRunner {private DemoMessageListener messagePublisher;@Overridepublic void run(String... args) throws Exception {// 订阅主题messagePublisher.listener("test_update");}
}

创建发消息
import com.chengxuyuanshitang.mq.publisher.DemoMessagePublisher;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@AllArgsConstructor
@RequestMapping("/front/test")
@Tag(name = "TestController", description = "TestController")
public class TestController {private final DemoMessagePublisher mssagePublisher;@GetMapping("/msg/send")@Operation(summary = "消息发送")public Boolean sendMsg() {mssagePublisher.publishMessage("test_update", "== test a msg==");return Boolean.TRUE;}
}




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4066.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux 重装】Ubuntu 启动盘 U盘无法被识别,如何处理?

背景 U盘烧录了 Ubuntu 系统作为启动盘&#xff0c;再次插入电脑后无法被识别 解决方案&#xff08;Mac 适用&#xff09; &#xff08;1&#xff09;查找 USB&#xff0c;&#xff08;2&#xff09;格式化&#xff08;1&#xff09;在 terminal 中通过 diskutil list 查看是…

【LLM-RL】DeepSeekMath强化对齐之GRPO算法

note 文章目录 note一、GRPOReference 一、GRPO 论文&#xff1a;DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models &#xff08;https://arxiv.org/pdf/2402.03300&#xff09;GRPO 在 DeepSeek V2 中采用了&#xff0c;GRPO 在训练过程…

Rust Actix Web 项目实战教程 mysql redis swagger:构建用户管理系统

Rust Actix Web 项目实战教程&#xff1a;构建用户管理系统 项目概述 本教程将指导你使用 Rust 和 Actix Web 构建一个完整的用户管理系统&#xff0c;包括数据库交互、Redis 缓存和 Swagger UI 文档。 技术栈 Rust 编程语言Actix Web 框架SQLx (MySQL 数据库)Redis 缓存Uto…

git系列之revert回滚

1. Git 使用cherry-pick“摘樱桃” step 1&#xff1a; 本地切到远程分支&#xff0c;对齐要对齐的base分支&#xff0c;举例子 localmap git pull git reset --hard localmap 对应的commit idstep 2&#xff1a; 执行cherry-pick命令 git cherry-pick abc123这样就会将远程…

Hadoop•用Web UI查看Hadoop状态词频统计

听说这里是目录哦 通过Web UI查看Hadoop运行状态&#x1f407;一、关闭防火墙二、在物理计算机添加集群的IP映射三、启动集群四、进入HDFS的Web UI 词频统计&#x1f9a9;1、准备文本数据2、在HDFS创建目录3、上传文件4、查看文件是否上传成功5、运行MapReduce程序6、查看MapRe…

国产编辑器EverEdit -重复行

1 重复行 1.1 应用场景 在代码或文本编辑过程中&#xff0c; 经常需要快速复制当前行&#xff0c;比如&#xff0c;给对象的多个属性进行赋值。传统的做法是&#xff1a;选中行-> 复制-> 插入新行-> 粘贴&#xff0c;该操作有4个步骤&#xff0c;非常繁琐。 那有没…

LabVIEW桥接传感器数据采集与校准程序

该程序设计用于采集来自桥接传感器的数据&#xff0c;执行必要的设置&#xff08;如桥接配置、信号采集参数、时间与触发设置&#xff09;&#xff0c;并进行适当的标定和偏移校正&#xff0c;最终通过图表呈现采集到的数据信息。程序包括多个模块&#xff0c;用于配置通道、触…

redis-排查命中率降低问题

1.命中率降低带来的问题 高并发系统&#xff0c;当命中率低于平常的的运行情况&#xff0c;或者低于70%时&#xff0c;会产生2个影响。 有大量的请求需要查DB&#xff0c;加大DB的压力&#xff1b;影响redis自身的性能 不同的业务场景&#xff0c;阈值不一样&#xff0c;一般…

edge浏览器恢复旧版滚动条

1、地址栏输入edge://flags 2、搜索Fluent scrollbars.&#xff0c;选择disabled&#xff0c;重启即可

【算法】算法基础课模板大全——第一篇

由于本文章内容太长&#xff0c;导致文章不能以一篇博客形式发布出来&#xff0c;所以我将分为两篇博客进行发布。 【算法】算法基础课模板大全——第一篇 【算法】算法基础课模板大全——第二篇 此笔记适用于AcWing网站的算法基础课&#xff0c;所有的资源链接、代码模板全部来…

Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测

Top期刊算法&#xff01;RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 Top期刊算法&#xff01;RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于RIME-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention、R…

日志收集Day002

1.ES的常见术语 索引(index)&#xff1a; 用户写入ES集群的逻辑单元。 分片(shard): 一个索引最少一个分片。 将索引的数据分布式的存储在ES集群。 副本(replica): 一个分片可以有0个或多个副本。 为同一个分片数据提供数据冗余。 文档(docment): …

微服务入门:从零开始构建你的微服务架构

微服务是一种软件开发架构风格&#xff0c;它把一个大的应用程序拆分成一系列小的服务。这些小的服务各自独立运行在自己的进程中&#xff0c;并通过轻量级的通信机制&#xff08;比如HTTP API&#xff09;进行交互。要通俗地理解微服务&#xff0c;可以从以下几个方面入手&…

Ubuntu 22.04 TLS 忘记root密码,重启修改的解决办法

1.想办法进入这个界面&#xff0c;我这里是BIOS引导的是按Esc按一下就行&#xff0c;UEFI的貌似是按Shift不得而知&#xff0c;没操作过。下移到Advanced options for Ubuntu&#xff0c;按enter 2.根据使用的内核版本&#xff0c;选择带「recovery mode」字样的内核版本&#…

电子电气架构 --- ECU故障诊断指南

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

Linux(DISK:raid5、LVM逻辑卷)

题目: DISK 添加4块大小均为10G的虚拟磁盘,配置raid-5磁盘。创建LVM命名为/dev/vg01/lv01,大小为20G,格式化为ext4,挂在到本地目录/webdata,在分区内建立测试空文件disk.txt。[root@storagesrv ~]# yum install mdadm -y [root@storagesrv ~]# mdadm -C -n 3 -l 5 -a y…

差异基因富集分析(R语言——GOKEGGGSEA)

接着上次的内容&#xff0c;上篇内容给大家分享了基因表达量怎么做分组差异分析&#xff0c;从而获得差异基因集&#xff0c;想了解的可以去看一下&#xff0c;这篇主要给大家分享一下得到显著差异基因集后怎么做一下通路富集。 1.准备差异基因集 我就直接把上次分享的拿到这…

软件测试——期末复习

文章目录 前言软件缺陷软件开发的过程软件测试黑盒测试等价类划分判定表法因果图法边界值分析法 白盒测试配置测试兼容性测试外国语言测试易用性测试自动化测试和测试工具缺陷轰炸和beta测试 前言 由于本人拖延症严重而且成绩较差&#xff0c;所以才在考试结束将近一个星期后&…

嵌入式硬件篇---基本组合逻辑电路

文章目录 前言基本逻辑门电路1.与门&#xff08;AND Gate&#xff09;2.或门&#xff08;OR Gate&#xff09;3.非门&#xff08;NOT Gate&#xff09;4.与非门&#xff08;NAND Gate&#xff09;5.或非门&#xff08;NOR Gate&#xff09;6.异或门&#xff08;XOR Gate&#x…

数据结构漫游记:动态实现栈(stack)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…