redis的消息发布订阅实现

news2024/11/28 6:55:07

文章目录

  • 前言
  • 一、创建好springboot项目,引入核心依赖
  • 二、使用步骤
    • 1. 自定义一个消息接受类
    • 2.声名一个消息配置类
    • 3.编写一个测试类
  • 总结


前言

一般项目中都会使用redis作为缓存使用,加速用户体验,实现分布式锁等等,redis可以说为项目中的优化,关键技术实现立下了汗马功劳.今天带来它的另一个功能,实现简单的消息发布订阅~,也就是说如果是简单的消息队列,首先是不需要我们自己实现的,其次很简单的那种,也无需引入mq相关的东西;


一、创建好springboot项目,引入核心依赖

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

二、使用步骤

1. 自定义一个消息接受类

代码如下(示例):

/**
 * @ClassName: MyReceiver
 */
@Component
@Slf4j
public class MyReceiver implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] pattern) {
        log.info("接受消息的通道:{}",new String(message.getChannel()));
        log.info("接受到的消息:{}",new String(message.getBody()));
//        Student student = JSONUtil.toBean(new String(message.getBody()), Student.class);
//       log.info("年龄:{}",student.getAge());
    }
}

2.声名一个消息配置类

代码如下(示例):

/**
 * @ClassName: ListenerConfig
 */
@Component
public class ListenerConfig {

    @Autowired
    MyReceiver myReceiver;

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        // 声名了两个接受消息的通道(主题)
        // 将myReceiver与消息通道绑定
        container.addMessageListener(listenerAdapter, new PatternTopic("redis_channel"));
        container.addMessageListener(listenerAdapter, new PatternTopic("redis_channel2"));
        return container;
    }

    //使用消息监听器容器注册Receiver,以便它将接收消息(监听onMessage方法)
    // 将上面的myReceiver注入到当前监听处理器中
    @Bean
    MessageListenerAdapter listenerAdapter() {
        return new MessageListenerAdapter(myReceiver, "onMessage");
    }
}

3.编写一个测试类

@SpringBootTest
class RedisTest {

    @Autowired
    StringRedisTemplate redisTemplate;

    @Autowired
    MyReceiver myReceiver;

    @Autowired
    ObjectMapper objectMapper;

    @Test
    void ss() throws JsonProcessingException {
        Student student = new Student();
        student.setAge(12);
        student.setId(11);
        redisTemplate.convertAndSend("redis_channel", JSONUtil.toJsonStr(student));
        redisTemplate.convertAndSend("redis_channel1", objectMapper.writeValueAsString("哈哈哈哈"));
        redisTemplate.convertAndSend("redis_channel2", objectMapper.writeValueAsString("嘻嘻嘻"));
    }

}

运行结果

代码中用的通讯实体,注意实现 Serializable 序列化

/**
 * 学生类
 *
 * @author ming
 */
public class Student implements Serializable {

    private int id;

    private String name;

    private int age;

    //一个学生有多个电话号码
    List tels = new ArrayList();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List getTels() {
        return tels;
    }

    public void setTels(List tels) {
        this.tels = tels;
    }



    public static class Tel {

        private String name;

        private String tel;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getTel() {
            return tel;
        }

        public void setTel(String tel) {
            this.tel = tel;
        }


    }
}

总结

可以看到

  1. 实现了消息的发布,以及消息的订阅接受消息
  2. 我在测试类中 RedisTest 发布了三条消息,但是在 myReceiver仅仅接受到了两条消息,是因为我在 ListenerConfig 配置类中仅仅给myReceiver 绑定了两条消息通道的原因
  3. myReceiver的注释可以打开,可以接收到消息并且可以转换为实体,接受到消息后可以任意处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YonBuilder应用构建教程之移动端基础配置

在YonBuilder中除了PC端应用的构建外&#xff0c;我们还可以构建配套的移动端页面。对于同一个数据实体可以实现PC端和移动端的数据同步修改&#xff0c;使数据录入、修改、审批等更加便捷。本篇文章通过对员工信息实体的移动端页面构建来对YonBuilder移动端配置的基础流程进行…

利用ENVI对遥感图像校正

1.几何校正 引起图像几何变形一般分为两大类:系统性和非系统性。系统性一般由传感器本身引起&#xff0c;有规律可循和可预测性&#xff0c;可以用传感器模型来校正&#xff0c;卫星地面接收站已经完成这项工作;非系统性几何变形是不规律的&#xff0c;它可以是传感器平台本身…

【Axure高保真原型】移动端钱包原型模板

今天和大家分享移动端钱包的原型模板&#xff0c;里面包含了11大模块&#xff0c;各个模块都是高保真高交互的原型模板&#xff0c;大家可以在演示地址里体验哦 【原型预览及下载地址】 https://axhub.im/ax9/4c3757a85d201a4c/#c1 这个原型还可以在手机上演示哦&#xff0c…

Bitmiracle Docotic.Pdf Library 8.8.14015 Crack

C# 和 VB.NET 的 PDF 库 Docotic.Pdf 是用于 .NET 的高性能 C# PDF 库。您可以使用它在 .NET Core、ASP.NET、Windows Forms、WPF、Xamarin、Blazor、Unity 和 HoloLense 应用程序中创建、阅读和编辑 PDF 文档。 该库支持 .NET 6、.NET 5、.NET Standard/.NET Core 和 .NET 4.…

Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()

目录 1--模板匹配 1-1--OpenCV API 1-2--六种匹配方法 1-3--代码实例 2--最值计算 2-1--OpenCV API 1--模板匹配 使用模板图像与原图像进行匹配&#xff0c;OpenCV提供了相应的模板匹配函数cv::matchTemplate()&#xff0c;并支持六种模板匹配方法。 1-1--OpenCV API vo…

【Linux】Linux项目自动化构建工具——make/Makefile

我举报&#xff0c;有人不学习&#xff01;&#xff01;&#xff01; 文章目录一、makefile原理二、初步理解makefile的语法1.gcc如何得知&#xff0c;源文件不需要再编译了呢&#xff1f;2.为什么执行的指令是make和make clean呢&#xff1f;三、makefile的推导规则四、Linux…

2023年1月数据治理认证DAMA-CDGA/CDGP(线上)招生简章

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

C语言刷题系列——17.计算平均成绩 18.找出总分最高的学生19.通讯录排序

结构 - PTA练习题&#x1f424;计算平均成绩&#x1f3c0; 题目要求&#x1f3c0; 题解&#x1f4bb;step1.定义结构体&#x1f4bb;step2.输入N&#xff1b;随后N行 每行给出一位学生的信息&#x1f4bb;step3.求平均值&#x1f4bb;step4.输出平均线以下的学生的信息&#x1…

数据可视化最简单的方式-饼状图,折线图,条形图

一个软件或者网站分为前端&#xff0c;后端。 后端传统意义就是处理后端的数据。 后端又分为数据库编程人员和后端业务逻辑人员。 前端顾名思义解决后端传递的数据。传递的数据如何显示是前端人员考虑的问题。 前端人员不光要设计好网页界面&#xff0c;而且要将数据的可视…

嵌入式:ARM协处理器指令总结

文章目录&#xff08;一&#xff09;协处理器的数据操作二进制编码汇编格式&#xff08;二&#xff09;协处理器的数据存取二进制编码汇编格式&#xff08;三&#xff09;协处理器的寄存器传送二进制编码汇编格式未使用的指令空间ARM支持16个协处理器&#xff0c;用于各种协处理…

java Redis基础 数据类型 常用命令 java中使用Redis

Redis是一个基于内存的key-value结构数据库。 Redis入门 Redis简介 Redis应用场景&#xff1a; Redis 下载与安装 Windows版下载地址&#xff1a;https://github.com/microsoftarchive/redis/releases Linux版下载地址&#xff1a; https://download.redis.io/releases/ Red…

Java 中的main方法原理介绍。

//深入了解main方法 // 解释main方法的形式为什么是这样写的&#xff1f; // public static void main(String[] args) // 问题1&#xff1a;是谁调用main方法&#xff1f; // java虚拟机调用main方法&#xff0c;所以main的访问权限是public // 问题2&#xff1a;为什么是st…

电竞游戏蓝牙耳机哪个牌子好?电竞游戏蓝牙耳机排行榜

喜欢玩游戏或是追剧的话&#xff0c;佩戴蓝牙耳机更加不易受到外界的干扰&#xff0c;传输效果好的蓝牙耳机能够带来更好的画面感和立体感&#xff0c;那么电竞游戏蓝牙耳机哪个牌子好呢&#xff1f;以下是小编整理的几款当前值得入手的游戏蓝牙耳机。 第一款&#xff1a;南卡…

Java多线程之线程安全问题

文章目录一. 线程安全概述1. 什么是线程安全问题2. 一个存在线程安全问题的程序二. 线程不安全的原因和线程加锁1. 案例分析2. 线程加锁2.1 理解加锁2.2 synchronized的使用2.3 再次分析案例3. 线程不安全的原因三. 线程安全的标准类一. 线程安全概述 1. 什么是线程安全问题 …

【QGIS入门实战精品教程】7.1:QGIS面状数据符号化设置案例教程

本文讲解QGIS空间数据符号化设置。 文章目录 一、符号化模式详解1. 单一色彩2. 字段分类3. 渐进4. 基于规则5. 翻转多边形6. 2.5维二、样式文件的保存与使用1. 保存样式文件2. 载入样式文件一、符号化模式详解 1. 单一色彩 数据加载后,默认显示单一色彩符号化模式,可以进行…

采购管理系统能为企业带来哪些好处?

随着信息化技术的不断发展&#xff0c;很多企业采购组织利用信息化手段来进行采购管理已然成为了一种趋势。 而且在日趋激烈的市场竞争与疫情影响下&#xff0c;企业的成本竞争优势显得尤为重要&#xff0c;据有关调查数据显示&#xff0c;许多企业成本中的70%是采购成本&…

[Flask]数据库的连接和操作

一、安装连接程序 在控制台中使用语句 pip install pymysql 即可安装 同时为了使用ORM对数据库进行操作&#xff08;而非sql语句&#xff09;&#xff0c;还需要安装SQLAlchemy pip install flask-sqlalchemy 二、使用Navicat管理数据库 安装Navicat软件&#xff0c;本体需要…

软件企业认证的条件是什么?

一、双软认证企业的认证标准&#xff1a; 1.企业法人是在我国的境内设立的企业法人; 2.企业计算机的软件开发和生产制造、系统集成、应用服务和其他有关技术服务为其经营业务及主要营业收入; 3.有一种以上由本企业开发或是由本企业具备知识产权的软件产品&#xff0c;或给…

绪论

&#x1f64c;作者简介&#xff1a;数学与计算机科学学院出身、在职高校高等数学专任教师&#xff0c;分享学习经验、生活、 努力成为像代码一样有逻辑的人&#xff01; &#x1f319;个人主页&#xff1a;阿芒的主页 ⭐ 高等数学专栏介绍&#xff1a;本专栏系统地梳理高等数学…

网络交换的技术

文章目录1、背景2、电路交换2.1、电路交换的特点2.2、电路交换的缺点3、分组交换3.1、分组交换的主要特点3.2、分组交换的传输单元3.3、分组交换的优点3.4、分组交换的缺点4、报文交换5、三种报文的区别1、背景 网络交换技术共经历了四个发展阶段: 电路交换技术(19世纪末)报文…