前言
Redis相信对于各位开发者的朋友来说都不会陌生,特别是后端的朋友会经常性的用到Redis来进行数据缓存等操作,今日我们就来聊聊Redis的发布(Pub)与订阅(Sub)模式的在SpringBoot下如何使用,并谈谈相关的应用场景。
使用方法
首先我们需要配置redis的相关依赖包:
1
2
3
4
|
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring–boot–starter–data–redis</artifactId>
</dependency>
|
然后我们需要配置Redis消息的监听容器:
1
2
3
4
5
6
7
8
|
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new PatternTopic(“topicName”)); //配置名称
return container;
}
|
接着我们新建一个消息实体,用于发送数据:
1
2
3
4
5
6
7
8
9
|
@Data
@AllArgsConstructor
public class Notice implements Serializable {
private String name;
private String val;
}
|
现在基本配置和消息数据体我们都定义好了,接着我们需要配置一个订阅端,用于监听订阅的消息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@Component
@Slf4j
public class LicoyWorkMessageListener extends MessageListenerAdapter {
@Autowired
private RedisTemplate redisTemplate;
@Override
public void onMessage(Message message, byte[] pattern) {
byte[] body = message.getBody();
byte[] channel = message.getChannel();
String topic = (String) redisTemplate.getStringSerializer().deserialize(channel);
if(!topic.equals(“topicName”)){
return;
}
Object res = redisTemplate.getValueSerializer().deserialize(body);
if(res instanceof Notice){ //如果反序列化得到的是我们定义的消息数据体类型
Notice notice = (Notice)res;
System.out.println(notice);
}else{
//其他处理
}
}
}
|
到这一步,万事俱备只欠东风了,现在我们只需要在需要用到的地方发布消息即可,如(作为演示,我直接在部分逻辑写在controller层,实际业务不建议这么做):
1
2
3
4
5
|
@GetMapping(“/notice/{name}/{val}”)
public ResponseResult notice(@PathVariable String name,@PathVariable String val){
redisTemplate.convertAndSend(“topicName”, new Notice(name,val));
return ResponseResult.ok();
}
|
使用场景
对于使用场景,就谈谈博主在开发中所用到的地方之一,一个平台,其分别有用户端/商家端,包含一个简单的Socket连接,用于商家及用户工单会话的消息通知,但是这两个是单独的Application,所以各自的Socket-Session分别保存在对应的内存栈中,因为不想让此复杂所以就没有采用其他框架就默认使用Springboot内置的WebSocket,但是WebSocketSession这个对象不支持序列化,所以就无法缓存到Redis中,那么只有(方法不一)两个端同时订阅一个频道,然后有新消息的时候通知两个端分别进行处理来发送消息给用户还是商家。
夜河资源网提供的所有内容仅供学习与交流。通过使用本站内容随之而来的风险以及法律责任与本站无关,所承担的法律责任由使用者承担。
一、如果您发现本站侵害了相关版权,请附上本站侵权链接和您的版权证明一并发送至邮箱:yehes#qq.com(#替换为@)我们将会在五天内处理并断开该文章下载地址。
二、本站所有资源来自互联网整理收集,全部内容采用撰写共用版权协议,要求署名、非商业用途和相同方式共享,如转载请也遵循撰写共用协议。
三、根据署名-非商业性使用-相同方式共享 (by-nc-sa) 许可协议规定,只要他人在以原作品为基础创作的新作品上适用同一类型的许可协议,并且在新作品发布的显著位置,注明原作者的姓名、来源及其采用的知识共享协议,与该作品在本网站的原发地址建立链接,他人就可基于非商业目的对原作品重新编排、修改、节选或者本人的作品为基础进行创作和发布。
四、基于原作品创作的所有新作品都要适用同一类型的许可协议,因此适用该项协议, 对任何以他人原作为基础创作的作品自然同样都不得商业性用途。
五、根据二〇〇二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可不经软件著作权人许可,无需向其支付报酬!
六、鉴此,也望大家按此说明转载和分享资源!本站提供的所有信息、教程、软件版权归原公司所有,仅供日常使用,不得用于任何商业用途,下载试用后请24小时内删除,因下载本站资源造成的损失,全部由使用者本人承担!
一、如果您发现本站侵害了相关版权,请附上本站侵权链接和您的版权证明一并发送至邮箱:yehes#qq.com(#替换为@)我们将会在五天内处理并断开该文章下载地址。
二、本站所有资源来自互联网整理收集,全部内容采用撰写共用版权协议,要求署名、非商业用途和相同方式共享,如转载请也遵循撰写共用协议。
三、根据署名-非商业性使用-相同方式共享 (by-nc-sa) 许可协议规定,只要他人在以原作品为基础创作的新作品上适用同一类型的许可协议,并且在新作品发布的显著位置,注明原作者的姓名、来源及其采用的知识共享协议,与该作品在本网站的原发地址建立链接,他人就可基于非商业目的对原作品重新编排、修改、节选或者本人的作品为基础进行创作和发布。
四、基于原作品创作的所有新作品都要适用同一类型的许可协议,因此适用该项协议, 对任何以他人原作为基础创作的作品自然同样都不得商业性用途。
五、根据二〇〇二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可不经软件著作权人许可,无需向其支付报酬!
六、鉴此,也望大家按此说明转载和分享资源!本站提供的所有信息、教程、软件版权归原公司所有,仅供日常使用,不得用于任何商业用途,下载试用后请24小时内删除,因下载本站资源造成的损失,全部由使用者本人承担!