关于java:Spring-Boot-2x基础教程使用Redis的发布订阅功能

8次阅读

共计 2916 个字符,预计需要花费 8 分钟才能阅读完成。

通过后面一篇集中式缓存的应用教程,咱们曾经理解了 Redis 的外围性能:作为 K、V 存储的高性能缓存。

接下来咱们会分几篇来持续讲讲 Redis 的一些其余弱小用法!如果你对此感兴趣,肯定要关注珍藏我哦!

公布订阅模式

如果你看过之前我写的对于 MQ 的相干文章,那么对于公布订阅性能应该不会生疏。如果没看过,那也不要紧,这里先做一个简略介绍,曾经理解的能够跳过间接看下一节内容。

什么是公布订阅模式?

在公布订阅模式中有个重要的角色,一个是发布者 Publisher,另一个订阅者 Subscriber。实质上来说,公布订阅模式就是一种生产者消费者模式,Publisher 负责生产音讯,而 Subscriber 则负责生产它所订阅的音讯。这种模式被宽泛的利用于软硬件的零碎设计中。比方:配置核心的一个配置批改之后,就是通过公布订阅的形式传递给订阅这个配置的订阅者来实现主动刷新的。

不就是观察者模式吗?

看到这里,学过设计模式的同学可能很容易将它与设计模式中的观察者模式分割起来,你会感觉公布订阅模式中的两个概念与观察者模式中的两个概念仿佛干的是一样的事件?所以:Publisher 就是观察者模式中的 Subject?Subscriber 就是观察者模式中的 Observer?

重要区别在哪里?

从这两种模式的角色工作来说的确是十分类似的,但从实现架构上来说有一个外围不同点!

咱们通过上面的图示来了解,就很清晰了:

能够看到这里有一个十分大的区别就是:公布订阅模式在两个角色两头是一个两头角色来过渡的,发布者并不间接与订阅者产生交互

回忆一下生产者消费者模式,这个两头过渡区域对应的就是是缓冲区。因为这个缓冲区的存在,发布者与订阅者的工作就能够实现更大程度的解耦。发布者不会因为订阅者处理速度慢,而影响本人的公布工作,它只须要疾速生产即可。而订阅者也不必太放心一时来不及解决,因为有缓冲区在,能够一点点排队来实现(也就是咱们常说的“削峰填谷”成果)。

而咱们所熟知的 RabbitMQ、Kafka、RocketMQ 这些中间件的实质其实就是实现公布订阅模式中的这个两头缓冲区。而 Redis 也提供了简略的公布订阅实现,当咱们有一些简略需要的时候,也是能够一用的!如果你曾经了解了这个概念,那么就进入下一节,一起来做个例子吧!

入手试一试

上面的入手工作,咱们将在 Spring Boot 利用中,通过接口的形式实现一个音讯发布者的角色,而后再写一个 Service 来实现音讯的订阅(把接口传过来的音讯内容打印解决)。

第一步:创立一个根底的 Spring Boot 利用,如果还不会点这里

第二步 pom.xml 中退出必须的几个依赖:

<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>

第三步:创立一个接口,用来发送音讯。

@SpringBootApplication
public 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
                public void onMessage(Message message, byte[] bytes) {
                    // 收到音讯的解决逻辑
                    log.info("Receive message :" + message);
                }
            }, CHANNEL.getBytes(StandardCharsets.UTF_8));

        }

    }

第六步:验证后果

  1. 启动利用 Spring Boot 主类
  2. 通过 curl 或其余工具调用接口curl localhost:8080/publish?message=hello
  3. 察看控制台,能够看到打印了收到的 message 参数
2021-06-19 16:22:30.935  INFO 34351 --- [ioEventLoop-4-2] .c.Chapter55Application$MessageSubscribe : Receive message : hello

好了,明天的内容到这里完结了。如果你对本系列教程《Spring Boot 2.x 基础教程》感兴趣,能够点击中转!。学习过程中如遇艰难,倡议退出 Spring 技术交换群,参加交换与探讨,更好的学习与提高!

代码示例

本文的残缺工程能够查看上面仓库中的 chapter5-5 目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

如果您感觉本文不错,欢送 Star 反对,您的关注是我保持的能源!更多本系列收费教程连载「点击进入汇总目录」

欢送关注我的公众号:程序猿 DD,分享其余中央看不到的常识与思考

正文完
 0