2021-06-28

Spring Boot 2.x基础教程:使用Redis的发布订阅功能

通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K、V存储的高性能缓存。

接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定要关注收藏我哦!

发布订阅模式

如果你看过之前我写的关于MQ的相关文章,那么对于发布订阅功能应该不会陌生。如果没看过,那也不要紧,这里先做一个简单介绍,已经了解的可以跳过直接看下一节内容。

什么是发布订阅模式?

在发布订阅模式中有个重要的角色,一个是发布者Publisher,另一个订阅者Subscriber。本质上来说,发布订阅模式就是一种生产者消费者模式,Publisher负责生产消息,而Subscriber则负责消费它所订阅的消息。这种模式被广泛的应用于软硬件的系统设计中。比如:配置中心的一个配置修改之后,就是通过发布订阅的方式传递给订阅这个配置的订阅者来实现自动刷新的。

不就是观察者模式吗?

看到这里,学过设计模式的同学可能很容易将它与设计模式中的观察者模式联系起来,你会觉得发布订阅模式中的两个概念与观察者模式中的两个概念似乎干的是一样的事情?所以:Publisher就是观察者模式中的Subject?Subscriber就是观察者模式中的Observer?

重要区别在哪里?

从这两种模式的角色任务来说确实是非常相似的,但从实现架构上来说有一个核心不同点!

我们通过下面的图示来理解,就很清晰了:

观察者模式

发布订阅模式

可以看到这里有一个非常大的区别就是:发布订阅模式在两个角色中间是一个中间角色来过渡的,发布者并不直接与订阅者产生交互

回想一下生产者消费者模式,这个中间过渡区域对应的就是是缓冲区。因为这个缓冲区的存在,发布者与订阅者的工作就可以实现更大程度的解耦。发布者不会因为订阅者处理速度慢,而影响自己的发布任务,它只需要快速生产即可。而订阅者也不用太担心一时来不及处理,因为有缓冲区在,可以一点点排队来完成(也就是我们常说的"削峰填谷"效果)。

而我们所熟知的RabbitMQ、Kafka、RocketMQ这些中间件的本质其实就是实现发布订阅模式中的这个中间缓冲区。而Redis也提供了简单的发布订阅实现,当我们有一些简单需求的时候,也是可以一用的!如果你已经理解了这个概念,那么就进入下一节,一起来做个例子吧!

动手试一试

下面的动手任务,我们将在Spring Boot应用中,通过接口的方式实现一个消息发布者的角色,然后再写一个Service来实现消息的订阅(把接口传过来的消息内容打印处理)。

第一步:创建一个基础的Spring Boot应用,如果还不会点这里

第二步pom.中加入必须的几个依赖:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId></dependency>

第三步:创建一个接口,用来发送消息。

@SpringBootApplicationpublic class Chapter55Application { private static String CHANNEL = "didispace"; public static void main(String[] args) {  SpringApplication.run(Chapter55Application.class, args); } @RestController static class RedisController {  private RedisTemplate<String, String> redisTemplate;  public RedisController(RedisTemplate<String, String> redisTemplate) {   this.redisTemplate = redisTemplate;  }  @GetMapping("/publish")  public void publish(@RequestParam String message) {   // 发送消息   redisTemplate.convertAndSend(CHANNEL, message);  } }}

这里为了简单实现,公用CHANNEL名称字段,我都写在了应用主类里。

第四步:继续应用主类里实现消息订阅,打接收到的消息打印处理

 @Slf4j @Service static class MessageSubscriber {  public MessageSubscriber(RedisTemplate redisTemplate) {   RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection();   redisConnection.subscribe(new MessageListener() {    @Override    pu......

原文转载:http://www.shaoqun.com/a/833920.html

跨境电商:https://www.ikjzd.com/

友家速递:https://www.ikjzd.com/w/1341

贝贝母婴网:https://www.ikjzd.com/w/1321

出口易:https://www.ikjzd.com/w/1317


通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K、V存储的高性能缓存。接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定要关注收藏我哦!发布订阅模式如果你看过之前我写的关于MQ的相关文章,那么对于发布订阅功能应该不会陌生。如果没看过,那也不要紧,这里先做一个简单介绍,已经了解的可以跳过直接看下一节内容。什么是发布订阅模式?在发布订阅模式中有
实操:什么是亚马逊Giveaway?怎么操作?:https://www.ikjzd.com/articles/21998
贝佐斯2018年工资曝光:年薪8.1万美金,可能都没你工资高:https://www.ikjzd.com/articles/21999
赶不上潮流?曾经的电商巨头eBay已经被淘汰?:https://www.ikjzd.com/articles/22000
应对中邮涨价,Wish提供运费补贴方案详解:https://www.ikjzd.com/articles/22003
把车开到没人的地方做 男朋友在车里㖭我高潮:http://lady.shaoqun.com/m/a/247148.html
换妻游戏没能给我带来难忘的快感(3/3):http://lady.shaoqun.com/m/a/66904.html
口述男朋友在车里㖭我下面 他的舌头弄得我欲仙欲死:http://www.30bags.com/m/a/249762.html
口述实录:我和父亲那难以启齿的秘密:http://www.30bags.com/m/a/249613.html
反复疼痛后,牙齿就不疼了。是自愈吗?不要太开心。:http://lady.shaoqun.com/a/390525.html
牙痛后不疼。需要看医生吗?:http://lady.shaoqun.com/a/390526.html
Prime Day后大复盘:小卖遗憾陪跑,大卖爆单未半而中道崩殂:https://www.ikjzd.com/articles/146115
亚马逊要求有效追踪率高于95%,卖家该怎么发货才有效?:https://www.ikjzd.com/articles/146102

No comments:

Post a Comment