【spring boot】【redis】spring boot 集成redis的发布订阅机制
一.简单介绍
1.redis的发布订阅功能,很简单。
消息发布者和消息订阅者互相不认得,也不关心对方有谁。
消息发布者,将消息发送给频道(channel)。
然后是由 频道(channel)将消息发送给对自己感兴趣的 消息订阅者们,进行消费。
2.redis的发布订阅和专业的MQ相比较
1>redis的发布订阅只是最基本的功能,不支持持久化,消息发布者将消息发送给频道。如果没有订阅者消费,消息就丢失了。
2>在消息发布过程中,如果客户端和服务器连接超时,MQ会有重试机制,事务回滚等。但是Redis没有提供消息传输保障。
3>简单的发布订阅可以使用redis,根据业务需求选择。
二.spring boot 集成[spring boot 2.x]
1.pom.xml文件
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring2.0集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<!-- 使用redis的LUA脚本 需要序列化操作的jar-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
2.redis的config
为redis添加消息适配器,绑定消息处理器
消息适配器 可以添加多个
package com.sxd.swapping.config; import com.sxd.swapping.redisReceiver.RedisReceiver;
import com.sxd.swapping.redisReceiver.RedisReceiver2;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer; /**
* @author sxd
* @date 2019/5/27 16:13
*/
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig { /**
* redis消息监听器容器
* 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
* 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter,
MessageListenerAdapter listenerAdapter2)
{
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory); //可以添加多个 messageListener
//可以对 messageListener对应的适配器listenerAdapter 指定本适配器 适配的消息类型 是什么
//在发布的地方 对应发布的redisTemplate.convertAndSend("user",msg); 那这边的就对应的可以消费到指定类型的 订阅消息
container.addMessageListener(listenerAdapter, new PatternTopic("user"));
container.addMessageListener(listenerAdapter2, new PatternTopic("goods")); return container;
} /**
* 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
*
* receiveMessage 是默认监听方法 一般不变
* @param redisReceiver redis消息处理器,自定义的
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter(RedisReceiver redisReceiver) {
System.out.println("消息适配器1进来了");
return new MessageListenerAdapter(redisReceiver, "receiveMessage");
} /**
* 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
*
* receiveMessage 是默认监听方法 一般不变
* @param redisReceiver2 redis消息处理器,自定义的
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter2(RedisReceiver2 redisReceiver2) {
System.out.println("消息适配器2进来了");
return new MessageListenerAdapter(redisReceiver2, "receiveMessage");
} //使用默认的工厂初始化redis操作模板
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
} @Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
RedisSerializer keySerializer = new StringRedisSerializer();
// RedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();
//key采用字符串反序列化对象
redisTemplate.setKeySerializer(keySerializer);
//value也采用字符串反序列化对象
//原因:管道操作,是对redis命令的批量操作,各个命令返回结果可能类型不同
//可能是 Boolean类型 可能是String类型 可能是byte[]类型 因此统一将结果按照String处理
redisTemplate.setValueSerializer(keySerializer);
return redisTemplate;
} }
3.创建几个消息处理器[处理消息订阅者 接收到消息后的业务]
package com.sxd.swapping.redisReceiver; import org.springframework.stereotype.Service; /**
*
* redis 订阅发布 消息接收器/处理器
* @author sxd
* @date 2019/5/30 17:12
*/
@Service
public class RedisReceiver { public void receiveMessage(String message) {
System.out.println("消息处理器1>我处理用户信息:"+message);
//这里是收到通道的消息之后执行的方法
//此处执行接收到消息后的 业务逻辑
}
}
package com.sxd.swapping.redisReceiver; import org.springframework.stereotype.Service; /**
* redis 订阅发布 消息接收器/处理器2
* @author sxd
* @date 2019/5/30 17:15
*/
@Service
public class RedisReceiver2 { public void receiveMessage(String message) {
System.out.println("消息处理器2>我处理商品信息:"+message);
//这里是收到通道的消息之后执行的方法
//此处执行接收到消息后的 业务逻辑
}
}
4.消息发布controller
@Autowired
RedisTemplate redisTemplate; /**
* redis 发布订阅pubsub
*/
@RequestMapping(value = "/redisPubSub")
public void redisPubSub(String msg){
if (msg.contains("用户")){
redisTemplate.convertAndSend("user",msg);
}else {
redisTemplate.convertAndSend("goods",msg);
}
}
测试:
发送请求:http://localhost:9666/redistest/redisPubSub?msg=用户---德玛西亚的用户
结果:
消息处理器1>我处理用户信息:用户---德玛西亚的用户
发送请求:http://localhost:9666/redistest/redisPubSub?msg=goods---德玛西亚的用商品
结果:
消息处理器2>我处理商品信息:goods---德玛西亚的用商品
【spring boot】【redis】spring boot 集成redis的发布订阅机制的更多相关文章
- Redis 学习(三) —— 事务、消息发布订阅
一.Redis事务 Redis 提供的事务机制与传统的数据库事务有些不同,传统数据库事务必须维护以下特性:原子性(Atomicity), 一致性(Consistency),隔离性(Isolation) ...
- Redis发布订阅机制
1. 什么是Redis Redis是一个开源的内存数据库,它以键值对的形式存储数据.由于数据存储在内存中,因此Redis的速度很快,但是每次重启Redis服务时,其中的数据也会丢失,因此,Redis也 ...
- 【redis】-- springboot集成redis及使用
springboot自动配置的redis并不是特别好用,所以需要我们使用原生的jedis, 1.添加依赖 2.在application文件中配置 # Redis服务器地址 redis.host= # ...
- nodejs redis 发布订阅机制封装
最近项目使用redis,对publish 和 subscribe的使用进行了了解,并进行了封装. var config = require('../config/config'); var log = ...
- Redis 发布/订阅机制原理分析
Redis 通过 PUBLISH. SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能. 这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播.实时 ...
- 六. Redis发布订阅机制
发布订阅(pub/sub)是一种消息通信模式,主要是解除消息发布者和消息订阅者之间通信的耦合. Redis作为一个pub/sub的服务器,在订阅者和发布者之间起到了一个消息路由的功能.订阅者可以通过s ...
- redis消息通知(任务队列/优先级队列/发布订阅模式)
1.任务队列 对于发送邮件或者是复杂计算这样的操作,常常需要比较长的时间,为了不影响web应用的正常使用,避免页面显示被阻塞,常常会将此类任务存入任务队列交由专门的进程去处理. 队列最基础的方法如下: ...
- Redis消息通知(任务队列和发布订阅模式)
Redis学习笔记(十)消息通知(任务队列和发布订阅模式) 1. 任务队列 1.1 任务队列的特点 任务队列:顾名思义,就是“传递消息的队列”.与任务队列进行交互的实体有两类,一类是生产者(produ ...
- 【Redis数据库】命令学习笔记——发布订阅、事务、脚本、连接等命令汇总
本篇基于redis 4.0.11版本,学习发布订阅.事务.脚本.连接的相关命令. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 序号 ...
随机推荐
- c# list集合简单快捷取随机
C#怎么在list集合中随机取出一个值: 首先我们取出这个List列表 然后生成随机数 最后通过这个随机数当作索引实现 var list = studentlist.OrderBy(a => a ...
- NOI.AC 722: tree
就贴个代码 #include <cstdio> #include <algorithm> typedef long long LL; const int MN = 200005 ...
- E05 【餐厅】What kind of coffee or tea would you like?
核心句型 What kind of coffee or tea would you like? 你想喝什么咖啡或者茶? What would you like? 你喜欢什么?/你想要什么? ...
- 201871010108-高文利《面向对象程序设计(java)》第七周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...
- day8_7.8 文件操作
一.文件模式 1.在文件的操作中,也有很多补充 的模式可使用 1.r+,可读可写模式,在此模式中,操作权限时可读可写,这里的写与write模式不一样的是,不再清空文件内容,写的内容添加到文件的后面,而 ...
- 16-numpy笔记-莫烦pandas-4
代码 import pandas as pd import numpy as np dates = pd.date_range('20130101', periods=6) df=pd.DataFra ...
- CF1234A Equalize Prices
洛谷 CF1234A Equalize Prices Again 洛谷传送门 题目描述 You are both a shop keeper and a shop assistant at a sma ...
- USACO Stock Market
洛谷 P2938 [USACO09FEB]股票市场Stock Market 洛谷传送门 JDOJ 2625: USACO 2009 Feb Gold 2.Stock Market JDOJ传送门 题目 ...
- 论文阅读笔记六十二:RePr: Improved Training of Convolutional Filters(CVPR2019)
论文原址:https://arxiv.org/abs/1811.07275 摘要 一个训练好的网络模型由于其模型捕捉的特征中存在大量的重叠,可以在不过多的降低其性能的条件下进行压缩剪枝.一些skip/ ...
- 洛谷 P1156 垃圾陷阱 题解
题目传送门 dp+排序+01背包 就完事了??? 貌似就是这样的 代码: //dp 排序 01背包 #include<iostream> #include<cstdio> #i ...