Springboot整合redis实现发布订阅功能介绍步骤_第1页
Springboot整合redis实现发布订阅功能介绍步骤_第2页
Springboot整合redis实现发布订阅功能介绍步骤_第3页
Springboot整合redis实现发布订阅功能介绍步骤_第4页
Springboot整合redis实现发布订阅功能介绍步骤_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论