首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Redis的消息发布和订阅(广播模式)

基于Redis的消息发布和订阅(广播模式)

原创
作者头像
悦stack
发布于 2023-06-30 09:42:03
发布于 2023-06-30 09:42:03
1.2K0
举报
文章被收录于专栏:MQMQ

最近在优化一个redis的大key问题, 原先的同事写法是将所有的配置都放在一个key里面, value是一个map. 但是随着配置越来越多, 这个map也变得很大, 已经影响redis的性能.遂决定将map里面的每个配置单独出来一个key, 当有配置变动的时候, 通过redis的消息队列通知到其他程序. 下面是在springboot中具体实现方式:

1.引入依赖

代码语言:txt
AI代码解释
复制
<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置监听

如下如所示, 定义了2个Linstener, 模拟2个应用监听同一个通道. 根据发送和接收的数据类型我们可以选择合适的数据序列化和反序列化方式, 默认序列化方式为RedisSerializer.java(). 对于普通的Bean来说使用json()java()的序列方式都可以.不同点在于:

  • RedisSerializer.java()使用JdkSerializationRedisSerializer,JDK提供的序列化功能。优点是反序列化时不需要提供类型信息(class),但缺点是需要实现Serializable接口,还有序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存@Configuration public class RedisConfig { public static final String TOPIC = "topic_1"; @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter, MessageListenerAdapter listenerAdapter2) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(listenerAdapter, new PatternTopic(TOPIC)); container.addMessageListener(listenerAdapter2, new PatternTopic(TOPIC)); return container; } @Bean MessageListenerAdapter listenerAdapter(Listener1 listener1) { System.out.println("listener1 register"); MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(listener1, "onMessage"); listenerAdapter.setSerializer(RedisSerializer.json()); return listenerAdapter; } @Bean MessageListenerAdapter listenerAdapter2(Listener2 listener2) { System.out.println("listener2 register"); MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(listener2, "onMessage"); listenerAdapter.setSerializer(RedisSerializer.java()); return listenerAdapter; } }3. 创建监听类@Component public class Listener1 implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { UserDTO userDTO = JSONObject.parseObject(message.toString(), UserDTO.class); System.err.println("listener1--->" + userDTO); } }@Component public class Listener2 implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { UserDTO userDTO = JSONObject.parseObject(message.toString(), UserDTO.class); System.err.println("listener2--->" + userDTO); } }
  • RedisSerializer.json()使用Jackson2JsonRedisSerializer, 借助Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍,不需要实现Serializable接口。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其只在反序列化过程中用到了类型信息
  • 监听类需实现MessageListener 接口,并实现OnMessage方法
  • 创建Listener2类, 模拟另外一个程序

4.发送消息(广播模式)

  • 调用redisTemplate.convertAndSend()方法, 发送消息到topic_1. 消息会通过redis广播至所有的消费者.@RestController public class TestController { @Autowired private RedisTemplate redisTemplate; @GetMapping("/test") public String test() { redisTemplate.setValueSerializer(RedisSerializer.string()); UserDTO userDTO = new UserDTO("sharloon", 18, 1); redisTemplate.convertAndSend("topic_1", JSON.toJSONString(userDTO)); return "test ok"; } }

5. 效果展示

代码语言:txt
AI代码解释
复制
listener2--->UserDTO(name=sharloon, age=18, sex=1)
listener1--->UserDTO(name=sharloon, age=18, sex=1)

6. demo地址

代码语言:txt
AI代码解释
复制
https://gitee.com/sharloon/redis-message

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis发布订阅模式
Redis自身提供了发布/订阅(publish/subscribe)模式。实现方式大致流程如下图:
ruochen
2021/11/22
1K0
利用Spring Data Redis 来实现消息的发布订阅机制
redis是一款高性能key-value存储系统,不仅能做缓存,还能用于消息队列 这里利用Spring Data Redis 来实现消息的发布订阅机制 Demo地址:GitHub - jujunchen/redis-queue-demo: redis 实现的消息 发布/订阅机制 一共3个应用,1个发布者应用,2个订阅者应用 发布者应用 RedisConfig redis序列化配置 Person 示例传输的POJO对象 Publisher 发布服务 @Component public cla
阿提说说
2022/12/02
7370
Redis 订阅模式详解
注意:发布返回的是订阅者数量,发布的消息不会持久化,没有订阅者时候,发布消息会丢失,当在发布消息之后对channel进行订阅不会收到之前发布的消息。
ruochen
2021/12/07
9650
Springboot2使用redis 进行消息的订阅发布
我们都知道redis 也有发布订阅模式, 但是使用的比较少。 并且redis的发布订阅不会持久化落入磁盘。总的来说就是不可靠。
分享干货的你
2021/04/23
1.6K1
补习系列(13)-springboot redis 与发布订阅
消息发布者是消息载体的生产者,其通过某些主题来向调度中心发送消息; 而消息订阅者会事先向调度中心订阅其"感兴趣"的主题,随后会获得新消息。
美码师
2019/01/23
1.9K0
Redis:发布(pub)与订阅(sub)实战
Redis发布订阅(Pub/Sub)是Redis提供的一种消息传递机制,它使用“发布者-订阅者”(publisher-subscriber)模式来处理消息传递。在这种模式下,发布者将消息发布到一组订阅者中,而无需关心谁是订阅者,也不需要知道订阅者是否收到了消息。
不惑
2023/11/17
2.3K1
Redis:发布(pub)与订阅(sub)实战
Redis之Spring实现发布订阅 原
注:Redis版本是4.0;Spring版本4.3.11;Redis client版本2.9.0。
克虏伯
2019/04/15
1.6K0
设计模式之发布订阅模式(2) Redis 发布/订阅模式
Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了发布订阅模式。该功能提供两种信息机制, 分别是“发布订阅到频道”和“发布订阅到模式”。
用户5546570
2019/06/06
1.7K0
设计模式之发布订阅模式(2) Redis 发布/订阅模式
redis实现消息队列
消息队列一般都会想到kafka,rabbitmq,Rockermq, 其实,给你印像做缓存的Redis也是能做消息队列.
星痕
2020/06/02
9460
重学SpringBoot3-集成Redis(六)之消息队列
Redis 不仅是一个高效的缓存解决方案,也具备强大的消息队列功能。通过 Redis 的 发布/订阅(Pub/Sub) 机制,开发者可以轻松实现服务之间的通信和消息传递功能,而无需引入专门的消息队列工具。这篇文章将介绍如何通过 Spring Boot 3 和 Redis 实现消息队列的发布与订阅功能。
CoderJia
2024/10/18
6030
重学SpringBoot3-集成Redis(六)之消息队列
SpringBoot 整合Redis 实现发布/订阅模式附带Redis集群配置
其实光从代码层面上讲,其实没有什么变化,主要是变化是关于Redis的配置需要更改为集群配置而已,之前接触过redis的话,那么就只需要看一下redis集群配置文件即可了。
宁在春
2022/10/31
9460
SpringBoot 整合Redis 实现发布/订阅模式附带Redis集群配置
深入理解Redis的Pub/Sub模式
Pub/Sub(发布/订阅)是一种消息传递模式,它允许一个或多个订阅者监听一个特定的主题(频道),当有新的消息发布到该主题时,所有订阅者都会收到通知。
烟雨平生
2023/11/07
1.9K0
深入理解Redis的Pub/Sub模式
springboot集成redis实现消息发布订阅模式
1,application.properties配置redis以及连接池 #redis spring.redis.host=localhost spring.redis.port=6379 #spring.redis.password= spring.redis.database=1 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1 spring.redis.pool.max-idle=500 spring.redis.pool.min
Java编程指南
2019/08/02
1.1K0
springboot2.0整合redis_灰度发布的方式
所有的订阅消息,都需要在这里进行注册绑定,new PatternTopic(“user”),表示发布的主题信息
全栈程序员站长
2022/11/09
5930
springboot2.0整合redis_灰度发布的方式
springboot redis 实现消息发布/订阅
发布消息 stringRedisTemplate.convertAndSend("myMsgChannel", "Any Message"); 订阅消息 // 创建消息监听器容器 @Bean public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer listenerContainer = new RedisMessag
路过君
2021/12/07
8570
SpringBoot开发案例之整合mail队列进阶篇
上一篇文章,我们为了解决实际场景中遇到的问题,使得其更像一个安全高效的邮件服务平台,我们引入了LinkedBlockingQueue队列对邮件发送进行流量削锋、间隔发送以及重复内容检测。
小柒2012
2018/03/30
1.4K3
SpringBoot开发案例之整合mail队列进阶篇
【附源码】SpringBoot集成Redis消息订阅发布
Receiver这是一个定义了一个接收消息的方法的类。当你把这个类作为一个消息监听器来注册后,你可以自定义消息接收的方法名。本例中采用“receiveMessage”作为接收消息的方法。
用户5224393
2019/08/13
8870
SpringBoot集成消息队列
最近在对公司开发框架进行优化,框架内涉及到多处入库的日志记录,例如登录日志/操作日志/访问日志/业务执行日志,集成在业务代码中耦合度较高且占用业务操作执行时间,所以准备集成相关消息队列进行代码解耦
code2roc
2023/07/19
3740
Spring-Data-Redis动态订阅发布
普通redis订阅,是以用container做容器,配置类配置文件方式直接在spring init的时候进行加载,不能进行动态添加。在程序运行时修改不起作用。
Diuut
2022/11/22
9610
【云原生进阶之PaaS中间件】第一章Redis-1.7发布订阅模式
        发布订阅模式(Publish-Subscribe Pattern)是一种消息传递模式,其基本原理是消息的发送者(发布者)不会直接发送消息给特定的接收者(订阅者),而是将消息分成不同的类别(频道),然后将消息发送给订阅了这些类别的所有接收者。发布订阅模式在分布式系统中广泛应用,例如实时消息推送、日志收集等。
江中散人_Jun
2023/10/16
4580
【云原生进阶之PaaS中间件】第一章Redis-1.7发布订阅模式
相关推荐
Redis发布订阅模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档