(十九)springboot实战——springboot集成redis实现消息的订阅与发布

前言 

本节内容主要介绍springboot项目通过集成redis,如何利用redis的订阅发布机制,完成系统消息的发布与订阅功能。Redis中的发布与订阅是一种消息通信模式,允许发送者(发布者)将消息发送给多个接收者(订阅者)。在 Redis中,发布与订阅通过PUBLISH和SUBSCRIBE命令实现。频道(Channel):频道是消息的通道,用于区分不同类型或主题的消息。订阅者可以选择订阅感兴趣的频道,以接收相应的消息。Redis的发布与订阅模式是无状态的,即发布者在发送消息之后不需要关心是否有订阅者接收到消息,也不需要维护订阅者的信息。当发布者向某个频道发布消息时,所有订阅了该频道的订阅者都会接收到相同的消息。这种机制使得消息的发布者和订阅者之间能够实现解耦,并支持一对多的消息传递方式,即广播形式。

正文

①创建一个web项目,引入redis启动器的pom依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

② 在application.yml中添加redis的配置

③创建redis的配置类, 初始化redis工具类RedisTemplate和redis订阅消息的监听容器RedisMessageListenerContainer

package com.yundi.atp.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {/*** 初始化一个Redis消息监听容器* @param connectionFactory* @return*/@Beanpublic RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);// 添加其他配置,如线程池大小等return container;}@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);redisTemplate.setDefaultSerializer(new StringRedisSerializer());return redisTemplate;}
}

 ④创建redis消息频道的常量

package com.yundi.atp.constant;public class ChannelConstant {/*** 广播通道*/public static final String CHANNEL_GLOBAL_NAME = "channel-global";/*** 单播通道*/public static final String CHANNEL_SINGLE_NAME = "channel-single";
}

⑤ 创建一个http请求,用于发布基于redis的消息供客户端订阅

package com.yundi.atp.controller;import com.yundi.atp.constant.ChannelConstant;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RequestMapping(value = "base")
@RestController
public class BaseController {@Resourceprivate RedisTemplate redisTemplate;/*** 发布广播消息** @param msg*/@GetMapping(value = "/publish/{msg}")public void sendMsg(@PathVariable(value = "msg") String msg) {redisTemplate.convertAndSend(ChannelConstant.CHANNEL_GLOBAL_NAME, msg);}
}

⑥ 创建一个消息订阅者,实现MessageListener接口,通过重写onMessage方法订阅消息

package com.yundi.atp.listen;import com.yundi.atp.constant.ChannelConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;@Slf4j
@Component
public class RedisMessageSubscriber implements MessageListener {@Autowiredprivate RedisMessageListenerContainer redisMessageListenerContainer;/*** 订阅消息:将订阅者添加到指定的频道*/@PostConstructpublic void subscribeToChannel() {//广播消息redisMessageListenerContainer.addMessageListener(this, new ChannelTopic(ChannelConstant.CHANNEL_GLOBAL_NAME));}@Overridepublic void onMessage(Message message, byte[] bytes) {String channel = new String(message.getChannel(), StandardCharsets.UTF_8);String messageBody = new String(message.getBody(), StandardCharsets.UTF_8);log.info("Received message: " + messageBody + " from channel: " + channel);}
}

 ⑦启动项目,通过http请求发布消息,查看是否能够订阅成功消息

⑧开启redis客户端测试,同样能够订阅到消息,证明redis的消息的订阅与发布是无状态的且是广播模式

 

结语

关于springboot集成redis实现消息的订阅与发布的内容到这里就结束了,我们下期见。。。。。。

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

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

相关文章

小型医院医疗设备管理系统|基于springboot小型医院医疗设备管理系统设计与实现(源码+数据库+文档)

小型医院医疗设备管理系统目录 目录 基于springboot小型医院医疗设备管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、职员信息管理 2、设备信息管理 3、库房信息管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、…

2.15日学习打卡----初学Zookeeper(二)

2.15日学习打卡 目录: 2.15日学习打卡一. Zookeeper部署运行伪集群安装集群安装服务管理 二. Zookeeper系统模型数据模型节点特性客户端命令行节点数据信息Watcher监听机制权限控制 ACL 三. 原生api操作Zookeeper四. zkclient库操作Zookeeper五. Apache Curator操作Zookeeper六…

Kubernetes基础(十八)-k8s存储对象Persistent Volume

1 什么是Persistent Volume&#xff1f; 在容器化应用中&#xff0c;Pod的生命周期是短暂的&#xff0c;当Pod终止时&#xff0c;其中的数据通常也会被销毁。为了解决这个问题&#xff0c;Kubernetes引入了Persistent Volume&#xff08;PV&#xff09;的概念。PV是集群中的一…

springboot/ssm物业管理系统Java小区物业缴费停车管理系统

springboot/ssm物业管理系统Java小区物业缴费停车管理系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&am…

C语言—指针(3)

嘿嘿嘿嘿&#xff0c;你看我像指针吗? 不会写&#xff0c;等我啥时候会写了再说吧&#xff0c;真的累了&#xff0c;倦了&#xff0c;有没有大佬教教我啊 1.面试题 1&#xff09;定义整形变量i&#xff1b; 2&#xff09;p为指向整形变量的指针变量&…

leetcode 1806. 还原排列的最少操作步数

题目链接&#xff1a;leetcode 1806 1.题目 给你一个偶数 n​​​​​​ &#xff0c;已知存在一个长度为 n 的排列 perm &#xff0c;其中 perm[i] i​&#xff08;下标 从 0 开始 计数&#xff09;。 一步操作中&#xff0c;你将创建一个新数组 arr &#xff0c;对于每个 …

5.12 BCC工具之undump.py解读

一,工具简介 undump工具用于ump UNIX 套接字数据包。这需要对内核函数进行动态跟踪,并且需要更新以匹配内核的改动。 二,代码示例 #!/usr/bin/python # @lint-avoid-python-3-compatibility-imports #from __future__ import print_function from bcc import BPF from bc…

loguru模块bind和filter的联合使用案例:将loguru改造为csv数据记录器

目录 使用场景filter函数bind函数赋予日志记录一个label的属性实际案例代码 使用场景 在运行程序的过程中&#xff0c;通常需要使用设置日志信息来方便追踪程序运行状态或者是调试&#xff0c;也常常需要进行多次运算并将计算结果进行保存。一般来说&#xff0c;日志信息可以通…

『论文阅读|研究用于视障人士户外障碍物检测的 YOLO 模型』

研究用于视障人士户外障碍物检测的 YOLO 模型 摘要1 引言2 相关工作2.1 障碍物检测的相关工作2.2 物体检测和其他基于CNN的模型 3 问题的提出4 方法4.1 YOLO4.2 YOLOv54.3 YOLOv64.4 YOLOv74.5 YOLOv84.6 YOLO-NAS 5 实验和结果5.1 数据集和预处理5.2 训练和实现细节5.3 性能指…

【内网穿透】如何在小米4A中刷OpenWRT并实现公网访问本地路由器

文章目录 前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理界面4.4 创建公网地址 5. 固定公网地址访问 前言 OpenWRT是一个高度模块化、高度自…

motplotlib图例案例1:通过多个legend完全控制图例显示顺序(指定按行排序 or 按列排序)

这个方法的核心&#xff0c;是手动的获得图中的handlers和labels&#xff0c;然后对它们进行切分和提取&#xff0c;最后分为几个legend进行显示。代码如下&#xff1a; 后来对下面的代码进行修改&#xff0c;通过handlers, labels get_legend_handles_labels(axs[axis])自动的…

新年红包的题解

目录 原题描述&#xff1a; 题目描述 题目背景 题目描述 输入格式 输出格式 样例 Input 1 Output 1 Input 2 Output 2 数据范围 主要思路&#xff1a; 代码code&#xff1a; 原题描述&#xff1a; 题目描述 题目背景 龙飞凤舞迎跨年&#xff0c;瑞雪飘飘送祝愿…

PS的常用快捷方式有哪些?

Adobe Photoshop&#xff08;简称 PS&#xff09;是一款流行的图像处理软件。以下是一些常用的 Photoshop 快捷方式&#xff1a; 文件操作&#xff1a; 新建文件&#xff1a;Ctrl N&#xff08;Windows&#xff09;/ Command N&#xff08;Mac&#xff09;打开文件&#xff1…

Spring Boot 笔记 024 登录页面

1.1 登录接口 //导入request.js请求工具 import request from /utils/request.js//提供调用注册接口的函数 export const userRegisterService (registerData)>{//借助于UrlSearchParams完成传递const params new URLSearchParams()for(let key in registerData){params.a…

LabVIEW风力机智能叶片控制系统

​LabVIEW风力机智能叶片控制系统 介绍了一种风力机智能叶片控制系统的开发。通过利用LabVIEW软件与CDS技术&#xff0c;该系统能够实时监测并调整风力机叶片的角度&#xff0c;优化风能转换效率。此项技术不仅提高了风力发电的稳定性和效率&#xff0c;而且为风力机的智能化管…

SpringBoot源码解读与原理分析(五)SpringBoot的装配机制

文章目录 2.5 Spring Boot的装配机制2.5.1 ComponentScan2.5.1.1 ComponentScan的基本使用方法2.5.1.2 TypeExcludeFilter(类型排除过滤器)2.5.1.3 AutoConfigurationExcludeFilter(自动配置类排除过滤器) 2.5.2 SpringBootConfiguration2.5.3 EnableAutoConfiguration2.5.3.1 …

世界顶级名校计算机专业,都在用哪些书当教材?

前言 在当今信息化、数字化时代&#xff0c;计算机科学已成为全球最为热门和重要的学科之一。世界顶级名校的计算机专业&#xff0c;更是培养未来行业领袖和创新人才的重要基地。那么&#xff0c;这些名校的计算机专业究竟使用哪些教材呢&#xff1f;这些教材又具有哪些特色和…

LabVIEW智能家居控制系统

LabVIEW智能家居控制系统 介绍了一个基于LabVIEW的智能家居控制系统的开发过程。该系统利用LabVIEW软件与硬件设备相结合&#xff0c;通过无线网络技术实现家居环境的实时监控与控制&#xff0c;提升居住舒适度和能源使用效率。 项目背景&#xff1a;随着科技的发展和生活水平…

BIO、NIO、Netty演化总结之二(手撸一个极简版netty)

之前的一片文章里面总结了一下IO模型的演进&#xff08;BIO、NIO、Netty演化总结-CSDN博客&#xff09;&#xff0c;里面给了一个示例AsyncNonBlockingServerWithThreadPool&#xff0c;最近想了想&#xff0c;发现这个代码跟netty的模型还是有一些出入&#xff0c;说是netty的…

【MATLAB】BiGRU神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 BiGRU神经网络回归预测算法是一种基于双向门控循环单元&#xff08;GRU&#xff09;的多变量时间序列预测方法。该方法结合了双向模型和门控机制&#xff0c;旨在有效地捕捉时间序列数据中…