




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Springboot整合redis实现发布订阅功能介绍步骤目录一、redis发布订阅简介二、几个核心概念解释三、适用场景四、与springboot的整合1、导入基础依赖2、配置文件3、自定义RedisSubConfig4、自定义消息监听器5、redistemplate的序列化6、功能测试
一、redis发布订阅简介
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收信息。可以参考下面两张图进行理解。
二、几个核心概念解释
1.频道
频道(channel)类似于一个快递柜,快递员往里面放快递,收件人去里面取快递。管道(channel)是由中间件(redis)提供的,一个redisServer中有多个channel。
2、消息发布者
可以理解为消息的生产者,消息发布者通过中间件(redis、mq等)向某个频道(管道)发送消息。
3、消息接收者
也可以理解为消息消费者,消息接收者通过订阅某个频道(管道)来接收发布者发布的消息。
发布者无需关心是否有人接收消息,发布者只需要把消息发布到某个管道中即可;
三、适用场景
1、核心业务完成后,非核心业务需要记录日志,发邮件,发短信之类的操作,一般来说,通过这种方式,核心业务与非核心业务起到了一个解耦的作用;
2、事件订阅,比如订阅UP主,博主相关的消息等;
3、监听事件,比如在分布式微服务场景下,当应用A的某个数据发生变化时,应用B需要同步更新自己的数据做自身业务操作,对于应用A来说并不关心哪个应用,就可以通过这种方式实现;
四、与springboot的整合
1、导入基础依赖
dependency
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-data-redis/artifactId
/dependency
2、配置文件
spring:
datasource:
driver-class-name:com.mysql.cj.jdbc.Driver
url:jdbc:mysql://IP:3306/schoolautoReconnect=trueuseUnicode=truecharacterEncoding=utf8serverTimezone=GMT%2B8useSSL=false
username:root
password:root
druid:
max-active:100
initial-size:10
max-wait:60000
min-idle:5
redis:
host:localhost
port:6379
cache:
type:redis
3、自定义RedisSubConfig
往容器(RedisMessageListenerContainer)内添加消息监听器,注意,container的参数列表是可以传多个监听器的,但是要定义监听器的bean。在定义监听器的方法体内绑定消息处理器和管道(channel),一个监听器可以监听多个管道,可以通过数组或者添加多个channel的方式定义;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.data.redis.connection.RedisConnectionFactory;
importorg.springframework.data.redis.listener.ChannelTopic;
importorg.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration
publicclassRedisSubConfig{
@Bean
publicRedisMessageListenerContainercontainer(RedisConnectionFactoryfactory,RedisMessageListenerlistener){
RedisMessageListenerContainercontainer=newRedisMessageListenerContainer();
container.setConnectionFactory(factory);
//订阅频道redis.news和redis.life这个container可以添加多个messageListener
container.addMessageListener(listener,newChannelTopic("redis.user"));
//container.addMessageListener(listener,newChannelTopic("redis.news"));
returncontainer;
}
4、自定义消息监听器
需要实现MessageListener接口,重写里面的onMessage方法,方法体内需要创建一个MessageListenerAdapter(这是一种规范写法,用于绑定消息处理器和监听器)。
这种写法和很多消息中间件对应的API很相似,即通过一个监听的代码块来完成监听到消息后具体的业务操作;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.data.redis.connection.Message;
importorg.springframework.data.redis.connection.MessageListener;
importorg.springframework.data.redis.core.RedisTemplate;
importorg.springframework.stereotype.Component;
@Component
publicclassRedisMessageListenerimplementsMessageListener{
@Autowired
privateRedisTemplateredisTemplate;
@Override
publicvoidonMessage(Messagemessage,byte[]pattern){
//获取消息
byte[]messageBody=message.getBody();
//使用值序列化器转换
Objectmsg=redisTemplate.getValueSerializer().deserialize(messageBody);
//获取监听的频道
byte[]channelByte=message.getChannel();
//使用字符串序列化器转换
Objectchannel=redisTemplate.getStringSerializer().deserialize(channelByte);
//渠道名称转换
StringpatternStr=newString(pattern);
System.out.println(patternStr);
System.out.println("---频道---:"+channel);
System.out.println("---消息内容---:"+msg);
}
5、redistemplate的序列化
@Bean
publicRedisTemplateObject,ObjectredisTemplate(RedisConnectionFactoryconnectionFactory){
RedisTemplateObject,Objecttemplate=newRedisTemplate();
template.setConnectionFactory(connectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializerjackson2JsonRedisSerializer=newJackson2JsonRedisSerializer(Object.class);
ObjectMappermapper=newObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(mapper);
template.setValueSerializer(jackson2JsonRedisSerializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(newStringRedisSerializer());
template.afterPropertiesSet();
returntemplate;
}
6、功能测试
下面写一个测试的接口,模拟业务处理完毕后,向redis.user这个通道发送一条消息,看看监听器中是否能够正常接收到消息即可;
@RestController
publicclassRedisPubController{
@Autowired
privateRedisTemplateredisTemplate;
@GetMapping("/getUserById")
publicStringgetUserById(StringuserId){
//TODO执行主业务
redisTemplate.conv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中级经济师考试分析试题及答案
- 工程项目进度延误的原因试题及答案
- 2025市政工程施工案例试题及答案
- 2024年工程起重机械项目资金需求报告代可行性研究报告
- 英语高级考试试题及答案
- 教学档案建设与秋季管理计划
- 扶贫助农面试题及答案
- 财务报表分析的重要性计划
- 拍卖品保管责任协议
- 专业约谈协议
- 2024年惠州市博罗县罗浮山文化旅游投资有限公司招聘笔试真题
- 钢结构桁架厂房拆除施工方案
- 脑病科医护沟通技巧
- 四年级数学(小数加减运算)计算题专项练习与答案
- 民宿实习报告总结
- 小区安全排查
- 中国典籍英译概述课件
- 【MOOC】航空发动机结构分析与设计-南京航空航天大学 中国大学慕课MOOC答案
- 红旅赛道未来规划
- 带电作业施工方案
- 宏定义与跨平台开发
评论
0/150
提交评论