SpringBoot_redis使用实战(四)_消息模式

redis消息

  • 1.简介
  • 2.入门
    • 2.1 编写消息监听器
    • 2.2 注册消息监听器
    • 2.3 发送消息
  • 3.进阶
    • 3.1ChannelTopic和PatternTopic
      • 3.1.1. ChannelTopic
      • 3.1.2. PatternTopic
    • 3.2 可靠性
  • 4.总结

1.简介

MessageListener是Spring Data Redis中的一个接口,它定义了处理接收到的Redis消息的方法。通过实现MessageListener接口,你可以创建自定义的消息监听器,用于处理从Redis中接收到的消息

2.入门

2.1 编写消息监听器

@Component
public class MyMessageListener implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {String channel = new String(message.getChannel());String content = new String(message.getBody());System.out.println("Received message from channel '" + channel + "': " + content);}
}

在这个示例中,MyMessageListener实现了MessageListener接口,并在onMessage方法中处理接收到的消息。

2.2 注册消息监听器

@Configuration
public class RedisConfig {// ... (省略其他配置)@Autowiredprivate MyMessageListener myMessageListener;@Beanpublic RedisMessageListenerContainer redisMessageListenerContainer() {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(redisConnectionFactory);// 配置监听的频道或模式container.addMessageListener(messageListener, new ChannelTopic("my-channel"));return container;}
}

在这个配置类中,我们通过redisMessageListenerContainer方法创建了一个RedisMessageListenerContainer实例,并将MyMessageListener消息监听器注册到了"my-channel"频道上。这样,在应用启动时,Redis就会监听名为"my-channel"的频道,当有消息到达时,会调用MyMessageListener的onMessage方法处理消息。

确保你的MyMessageListener类已经实现了MessageListener接口,并在onMessage方法中定义了处理消息的逻辑。同时,Spring会自动扫描并识别RedisConfig类,确保它被正确加载。

2.3 发送消息

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.data.redis.core.StringRedisTemplate;@RestController
@RequestMapping("/api/messages")
public class MessageController {private final StringRedisTemplate redisTemplate;@Autowiredpublic MessageController(StringRedisTemplate redisTemplate) {this.redisTemplate = redisTemplate;}@GetMapping("/send/{channel}/{message}")public String sendMessage(@PathVariable String channel, @PathVariable String message) {// 发送消息到指定的频道redisTemplate.convertAndSend(channel, message);return "Message sent to channel '" + channel + "': " + message;}
}

3.进阶

3.1ChannelTopic和PatternTopic

3.1.1. ChannelTopic

  • 作用: ChannelTopic表示一个具体的消息频道,消息会被发送到这个频道中。订阅者(消息监听器)需要订阅特定的频道,以接收该频道中的消息。

  • 使用场景: 当你想要将消息发送到一个特定的频道,并且只希望特定订阅者能够接收到这个频道中的消息时,你可以使用ChannelTopic。

ChannelTopic channelTopic = new ChannelTopic("my-channel");
container.addMessageListener(messageListener, channelTopic);

3.1.2. PatternTopic

作用: PatternTopic表示一个消息频道的模式,它允许使用通配符来匹配多个频道。消息会被发送到与模式匹配的所有频道中。

使用场景: 当你希望将消息发送到多个频道,并且这些频道都符合特定的模式时,你可以使用PatternTopic。例如,你可以使用通配符"news.*"表示所有以"news."开头的频道。

PatternTopic patternTopic = new PatternTopic("news.*");
container.addMessageListener(messageListener, patternTopic);

在使用PatternTopic时,消息监听器会接收所有匹配模式的频道中的消息。这对于需要广播消息给符合特定条件的订阅者的场景非常有用。

选择使用ChannelTopic还是PatternTopic取决于你的具体需求:如果你需要将消息发送到一个特定的频道,使用ChannelTopic;如果你需要将消息发送到多个符合特定模式的频道,使用PatternTopic。

3.2 可靠性

  1. 持久化配置: 如果Redis服务器配置了持久化(例如RDB快照、AOF日志),即使Redis服务器宕机,当Redis重新启动并加载数据时,以前发布的消息仍然可以被新的订阅者消费。

  2. 消息确认机制: Redis的发布/订阅模式本身不提供消息确认机制,即消息的发送者无法确认消息是否被订阅者消费。如果你需要消息确认机制,可以考虑使用消息队列(例如RabbitMQ、Kafka等),这些消息队列通常提供了消息的确认机制,确保消息被成功消费。

  3. 持久订阅者: 在Redis中,普通的订阅者在断开连接后会失去之前的消息,即使重新连接也无法再收到之前发布的消息。

  4. 错误处理和重试策略: 如果消息的消费者处理消息时发生错误,你需要在消费者端实现错误处理和重试策略。例如,在出现异常时,将消息记录到错误日志中,并根据需要进行重试。

4.总结

总的来说,Redis的发布/订阅模式不是为了提供高可靠性消息传递而设计的,它更适用于简单的消息发布和订阅场景。如果你需要更严格的消息可靠性传递和确认机制,建议考虑使用专门的消息队列系统

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

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

相关文章

c++ 高效使用vector(面试)

文章目录 1.善用Reserve提前分配足够的空间2. 使用 shrink_to_fit() 释放 vector 占用的内存, – clear() 或 erase() 不会释放内存3 在填充或者拷贝到 vector 的时候,应该使用赋值而不是 insert() 或push_back()4 遍历 std::vector 元素的时候&#xff…

Maven多模块管理(转载)

注意:父模块需设定打包方式为pom https://cloud.tencent.com/developer/article/1667275 dependencyManagement 统一管理子类依赖版本 在父类maven中加入,不会继承给子类,只能规定子类的依赖版本,子类加入dependence后无需写入 …

【前端学习】—JS判断数据类型的方式有哪些(八)

【前端学习】—JS判断数据类型的方式有哪些(八) 一、JS中判断数据类型的场景 二、JS中有哪些数据类型 三、JS判断数据类型的方式有哪些 const arr[]; const object{};const number1; const stringstring;//typeofconst typetypeof arr; console.log(type…

从头开始机器学习:神经网络

一、说明 如果你还没有做过逻辑回归,你会在这里挣扎。我强烈建议在开始之前查看它。您在逻辑回归方面的能力将影响您学习神经网络的难易程度和速度。 二、神经网络简介 神经网络是一个神经元网络。这些神经元是逻辑回归函数,它们被链接在一起形成一个网络…

只会Python,怎么用PC控制无人机自动飞行?

PC-SDK是阿木实验室 (AMOVLAB) 为了简化开源飞控的控制协议MAVLink,优化和维护的一个基于PC电脑运行MAVSDK(支持Windows和Ubuntu)的Python SDK库。 相对于传统的无人机控制开发,开发者无需掌握C/C语言和ROS等相关知识,只要学会Python编程及懂…

Gin:获取本机IP,获取访问IP

获取本机IP func GetLocalIP() []string {var ipStr []stringnetInterfaces, err : net.Interfaces()if err ! nil {fmt.Println("net.Interfaces error:", err.Error())return ipStr}for i : 0; i < len(netInterfaces); i {if (netInterfaces[i].Flags & ne…

leetcode 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…

wsl使用vscode连接,远程安装C/C++ 拓展时,报错

报错内容&#xff1a; EACCES: permission denied, rename /home/wen/.vscode-server/extensions/.b61b1c7c-f703-4dfd-bdc5-d9a00681c4b7 -> /home/wen/.vscode-server/extensions/ms-vscode.cpptools-1.17.5-linux-x64 解决办法&#xff1a; 升级wsl到wsl2就好了。 &a…

Vue-router快速入门 是什么 如何跳转 如何传值的问题

3.1 Vue-router是什么 Vue-router:Vue.js 的官方路由为 Vue.js 提供富有表现力、可配置的、方便的路由 官网&#xff1a;https://router.vuejs.org/zh/ 作用&#xff1a; 1.实现vue页面(组件)的跳转 2.可以在跳转的时候携带参数 3.2 Vue3使用Vue-router(静态路由) 基于Vu…

C# CodeFormer Inpainting 人脸填充

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace CodeFormer_D…

UnitTesting 单元测试

1. 测试分为两种及详细介绍测试书籍: 1.1 Unit Test : 单元测试 - test the business logic in your app : 测试应用中的业务逻辑 1.2 UI Test : 界面测试 - test the UI of your app : 测试应用中的界面 1.3 测试书籍网址:《Testing Swift》 https://www.hackingwithswift.c…

MySQL——六、库表操作(下篇)

MySQL 一、INSERT语句二、REPLACE语句三、UPDATE语句四、delete和TRUNCATE语句五、MySQL用户授权1、密码策略2、用户授权和撤销授权 一、INSERT语句 #在表里面插入数据&#xff1a;默认情况下&#xff0c;一次插入操作只插入一行 方式1&#xff1a; INSERT [INTO] 表名 [(colu…

uni-app小程序使用DCloud(插件市场)流程

一、DCloud&#xff08;插件市场&#xff09; DCloud 是uni-app官方插件市场&#xff0c;里面有官方、团队、个人发布的众多插件&#xff0c;包括uni-ui、uni-pay 等。而像uni-ui这种大型组件库都有官方文档可参考&#xff0c;但一些团队或个人发布的小型插件没有文档&#xf…

数据结构-快速排序Java实现

目录 一、引言二、算法步骤三、原理演示第一步&#xff1a;选择基准元素第二步&#xff1a;分区&#xff08;Partition&#xff09;第三步&#xff1a;递归第四步&#xff1a;合并 四、代码实战五、结论 一、引言 快速排序的核心思想是选择一个基准元素&#xff0c;将数组分为两…

垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程

文章目录 &#x1f34a; 垃圾回收器、垃圾回收算法、空间分配担保&#x1f389; Serial&#x1f389; ParNew&#x1f389; Parallel scavenge&#x1f389; 复制算法&#x1f389; 分代收集算法&#x1f389; 进入老年代的几种情况&#x1f4dd; 空间分配担保 &#x1f389; S…

超火的双臂烹饪机器人Project YORI,分分钟成为你的专属大厨!

原创 | 文 BFT机器人 当前行业内有两种通用的烹饪自动化方法&#xff1a;一种是“制造一个可以在普通厨房中运作的烹饪机器人&#xff0c;因为每个人都有厨房”&#xff0c;这听起来很不错&#xff0c;但接下来你就必须使你的烹饪机器人能够在厨房环境中正常运行&#xff0c;这…

docker 复习

文章目录 1. docker 基础1.1 docker 安装配置镜像加速器拉取镜像的仓库&#xff1a; docker 部署Mysql 镜像docker 命令的详细解释docker 常见命令docker 数据卷docker 相关命令总结 2.自定义镜像2.1 dockerfile2.2 try 构建一个Java镜像&#xff0c;并部署2.3 总结: 3. docker…

物流监管:智慧仓储数据可视化监控平台

随着市场竞争加剧和市场需求的不断提高&#xff0c;企业亟需更加高效、智能且可靠的仓储物流管理方式&#xff0c;以提升企业的物流效率&#xff0c;减少其输出成本&#xff0c;有效应对市场上的变化和挑战。 图扑自研 HT for Web 产品搭建的 2D 智慧仓储可视化平台&#xff0c…

2023年各省市区CMMI奖励补贴政策,最高150万元!!!

2023年CMMI资质认证补贴政策已落实&#xff0c;全国各省市政府相继给了很多补贴政策支持企业办理CMMI认证&#xff0c;有不少地区都是可以领取CMMI资质补贴的&#xff0c;来看看你企业所在地有没有补贴吧&#xff01; 北京 北京市 对服务外包企业取得的国际资质认证、或因数字…

Databend 开源周报第 115 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 聚合索引 Data…