一、简介

  • 1、发布订阅 SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Rather, 发布的消息进入通道,不需要知道有没有订阅者. 订阅者发表感兴趣的一个或多个通道,并且只接受他们感兴趣的消息,不管发布者是不是存在. 发布者和订阅者的解耦可以允许更大的伸缩性和更多动态的网络拓扑。

二、注入消息发布/订阅

  • 1、添加消息监听器
/** * 消息监听 * 

* 可以传入多个 MessageListenerAdapter */@BeanRedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory, MessageListenerAdapter messageListenerAdapter) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); // 监听所有库的key过期事件 container.setConnectionFactory(connectionFactory); // 可以添加多个 messageListener,配置不同的通道 container.addMessageListener(messageListenerAdapter, new PatternTopic("user")); return container;}

所有的订阅消息,都需要在这里进行注册绑定,new PatternTopic(“user”),表示发布的主题信息

  • 小插曲 前面我们学习了监听 key 过期事件,如果我们只需要监听当前库的 key 过期事件,可以这样写:
@Value("${spring.redis.database}")public String redisDatabaseIndex;

先拿到我们项目中使用的 Redis 的库索引

// 监听当前库的key过期container.addMessageListener(messageListenerAdapter, new PatternTopic("__keyevent@" + redisDatabaseIndex + "__:expired"));

然后使用发布/订阅模式,订阅主题为:keyevent@0:expired 的消息,则表示订阅数据库索引为 0 的 key 过期事件,监听所有的库则为:keyevent@*:expired

  • 2、绑定消息处理器
/** * 消息监听器适配器,绑定消息处理器 * 

* 可以配置多个 listenerAdapter,监听不同的通道 */@BeanMessageListenerAdapter listenerAdapter(RedisMessageListener receiver) { return new MessageListenerAdapter(receiver, "onMessage");}

也就是说,当我们订阅的频道,当有消息进来时,指定它的处理类以及处理方法

三、注入消息处理器

上面我们已经注入了 RedisMessageListener 消息处理器,并指定了处理方法 onMessage(),代码如下:

package com.zyxx.common.redis;import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.connection.MessageListener;import org.springframework.stereotype.Component;/** * Redis 消息接收 * * @Author Lizhou **/@Slf4j@Componentpublic class RedisMessageListener implements MessageListener {    @Override    public void onMessage(Message message, byte[] pattern) {        // 接收的topic        log.info("channel:" + new String(pattern));        // 消息的POJO        log.info("message:" + message.toString());    }}

需要实现 MessageListener 接口,重写 onMessage() 方法,然后就可以获取到通道以及消息了,从而进行我们的一些业务逻辑处理

四、操作API

在 RedisUtils 中,我们增加一个操作方法

/** * 向通道发布消息 */public boolean convertAndSend(String channel, Object message) {    if (StringUtils.isBlank(channel)) {        return false;    }    try {        template.convertAndSend(channel, message);        log.info("发送消息成功,channel:{},message:{}", channel, message);        return true;    } catch (Exception e) {        log.info("发送消息失败,channel:{},message:{}", channel, message);        e.printStackTrace();    }    return false;}

这里的 channel 相当于 我们存入数据的时候的 key,如果该通道不存在,则会新建一个通道

五、测试

  • 1、测试用例
package com.zyxx.redistest;import com.zyxx.redistest.common.RedisUtils;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestclass RedisTestApplicationTests {    @Autowired    private RedisUtils redisUtil;    @Test    void contextLoads() {        String message = "Hello World!";        // 发送消息        redisUtil.convertAndSend("user", message);    }}

我们向通道 user 发送了一条 “Hello World!” 的消息

  • 2、测试结果

可以看出,我们的消息发送成功,再看控制台

我们接收到通道 user 发送了一条 “Hello World!” 的消息

作者:Asurplus、

原文链接:https://lizhou.blog.csdn.net/article/details/109238701

nodejs redis 发布订阅_SpringBoot整合Redis,怎么实现发布/订阅?相关推荐

  1. redis 连接池_SpringBoot整合redis

    闲来没事,把之前自己搭建的SpringBoot集成Redis整理了一下,相信网上有很多,我只是写一下搭建的文章,能帮到就好,不能帮助,也是自己整理的文档罢了.文章开始: 开发工具用的IDEA 2018 ...

  2. redis缓存原理与实现_SpringBoot整合Redis缓存,手把手教你一步一步实现

    推荐学习 分布式大全:反向代理/Redis/中间件/MySQL/消息,挑战阿里P7必备 都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场" 微服务 ...

  3. redis序列化_SpringBoot整合redis

    redis是最常用的缓存数据库,常用于存储用户登录token.临时数据.定时相关数据等. redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题. redis基于内存,速度 ...

  4. @primary注解_springboot整合redis分别实现手动缓存和注解缓存

    一.前期准备 1.一个构建好的springboot系统2.下载redis安装包,去redis官网下载3.启动redis服务,windows下双击bin目录下的redis-service.exe 二.环 ...

  5. redis进阶之SpringBoot整合Redis(五)

    在聊 SpringBoot整合redis之前,我们先看看 Redis推荐的java连接开发工具:jedis知其然并知其所以然,授人以渔! 学习不能急躁,慢慢来会很快! Jedis 什么是Jedis 是 ...

  6. redis工具类_SpringBoot 操作 Redis 数据

    SpringBoot 操作 Redis 数据 简介 Redis 是一个开源的NoSQL数据库,基于内存的键值存储,速度快.Redis 支持数据结构,如字符串,散列,列表,集和带范围查询的有序集. 5种 ...

  7. Redis学习 - NoSQL简介、redis安装、redis基础知识、数据类型、持久化、订阅发布、主从复制、哨兵模式、缓存击穿和雪崩

    学习视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 完结撒花,感谢狂神 文章目录 1. NoSQL 1.1 单机Mysql的演进 1.2 当今企业架构 ...

  8. Spring Boot(十三):整合Redis哨兵,集群模式实践

    前面的两篇文章(Redis的持久化方案, 一文掌握Redis的三种集群方案)分别介绍了Redis的持久化与集群方案 -- 包括主从复制模式.哨兵模式.Cluster模式,其中主从复制模式由于不能自动做 ...

  9. spring boot使用Jedis整合Redis

    文章目录 spring boot使用jedis整合redis 总结 Spring Boot整合Redis有两种方式,分别是Jedis和RedisTemplate,那么它们二者有什么区别呢? 1.Jed ...

最新文章

  1. xshell通过隧道连接_工作常见问题--如何解决xshell远程连接自动断开的问题
  2. Java基础学习总结(52)——Liunx系统Centos上搭建Java开发环境
  3. 【PyQT5编程】Pycharm结合QtDesigner使用示例:创建登录窗体
  4. NV133FHM-N52屏在rk3288的Android7.1上的点亮
  5. mac地址和ip地址的区别(转)
  6. 计算机视觉必备框架!Opencv系列学习实战
  7. 大学计算机专业全民,计算机专业大学排名实力顺序(上大学国内计算机专业大学哪个好值得报读)...
  8. gitlab一键安装 笔记
  9. SQL递归查询知多少
  10. linux 内核参数解释整理
  11. 树莓派制作遥控小车教程
  12. 盐城北大青鸟东台基地学员生日会 | 美好的时光里,你我同在
  13. 城市空气pm2.5数据调用实现
  14. 数字电路2. OC门、OD门、三态门
  15. ORA-29702错误解决
  16. 配置使用costmap_2d_node
  17. 深入浅出通信原理知识点7
  18. C3P0数据库连接池的配置
  19. Site-to-Site VPN配置和调试实践:构建安全的远程网络连接
  20. 最近有公司的大数据哥们反馈OKI是0

热门文章

  1. 神经网络的设计与分析之概述
  2. 如何计算空中四个点是不是在一个平面上
  3. TensorFlow的基本运算01-01
  4. CSS3背景线性渐变
  5. java been 字段命名的坑
  6. VM虚拟机的配置文件(.vmx)损坏修复
  7. linux/unix inode的一个面试问题及一些概念
  8. Java基础语法纯小白入门
  9. JSP实现停车场收费管理系统
  10. RNA-seq:【FastQC】