Spring Cloud 集成 Redis 发布订阅

目录

  • 前言
  • 步骤
    • 引入相关maven依赖
    • 添加相关配置
  • 使用方法
    • 发布订阅
    • 发布一个消息
  • 注意
  • 总结

前言

在当今的软件开发领域,分布式系统已经成为一种主流的架构模式,尤其是在处理大规模、高并发、高可用的业务场景时。然而,随着系统复杂性的增加,缓存机制的重要性也日益凸显。缓存不仅可以帮助我们减轻数据库压力,提高系统响应速度,还能在一定程度上保证系统的稳定性和可靠性。
Redis,作为一款开源的、高性能的、支持多种数据结构的NoSQL数据库,已经成为缓存领域的佼佼者。它提供了丰富的数据结构支持,如字符串、哈希、列表、集合和有序集合等,使得开发者能够灵活地根据业务需求进行数据存储和读取。同时,Redis还支持事务、持久化、发布订阅等高级功能,极大地增强了其应用场景的广泛性和实用性。
Spring Cloud,作为Spring家族中的一员,致力于提供一套完整的微服务解决方案。它集成了众多的开源组件,使得开发者能够轻松地构建、部署和管理微服务应用。在缓存方面,Spring Cloud也提供了强大的支持,通过集成Redis等缓存技术,可以轻松地实现数据的缓存和共享。
因此,将Spring Cloud与Redis进行集成,不仅可以充分发挥两者的优势,还能为开发者提供更加便捷、高效的缓存解决方案。通过Spring Cloud的集成,我们可以方便地配置Redis缓存的相关参数,如缓存的过期时间、缓存的淘汰策略等。同时,我们还可以利用Spring Cloud提供的分布式缓存机制,实现多个服务节点之间的缓存共享和同步。
在本文中,我们将详细介绍如何在Spring Cloud应用中集成Redis缓存,并展示如何通过简单的配置和代码实现数据的高效缓存和读取。希望通过本文的分享,能够帮助读者更好地理解Spring Cloud与Redis的集成方式,并在实际项目中加以应用,提升系统的性能和稳定性。

步骤

引入相关maven依赖

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

添加相关配置

spring:  redis: # Redis相关配置的开始,这里定义了连接到Redis服务所需要的参数  host: 127.0.0.1 # Redis服务器的主机地址,这里是本地地址,用于连接本地的Redis服务  port: 6379 # Redis服务的端口号,默认通常是6379  password: 1q@w3e4r # Redis服务器的密码,如果Redis服务器设置了密码,这里需要填写对应的密码  database: 0 # 使用的Redis数据库的索引号,默认为0,Redis可以有多个数据库,通过索引号来区分

在Spring Boot或Spring Cloud应用中,上述配置通常在application.yml或application.properties文件中进行。spring.redis下配置的是连接Redis服务器所必需的参数,包括主机地址、端口号、密码和使用的数据库索引。这些参数将被Spring Boot自动配置机制用于构建Redis连接工厂,从而实现对Redis的访问。
需要注意的是,如果Redis服务器未设置密码,password字段可以省略或留空。同时,如果使用的是默认端口(6379)和默认数据库(0),这些配置项也可以根据实际情况省略。
此外,对于更复杂的Redis使用场景,如连接池配置、哨兵模式或集群模式,还需要添加更多的配置项来指定相关参数。在实际应用中,应根据项目需求和Redis服务器的配置来选择合适的配置项。

使用方法

发布订阅

  1. 构建发布订阅全局实体
@Getter
@Setter
public class RedisMessageBo {/*** 全局唯一id*/private String uuid;/*** 其他信息*/private String message;
}
  1. 声明交换机名称
/*** 交换机名称** @author 30346*/
public class ConstantConfiguration {public static final String EXCHANGE_NAME = "exchange_name";
}
  1. 创建消息适配器
@Configuration
public class RedisListenerAdapter {/*** 消息适配器** @param receiver 接收者* @return {@link MessageListenerAdapter}*/@BeanMessageListenerAdapter listenerAdapter(MessageSubListener receiver) {return new MessageListenerAdapter(receiver);}
}
  1. 发布监听配置
/*** 发布监听配置** @author 30346*/
@Configuration
public class RedisPubListenerConfig {@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter messageListenerAdapter) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);// 可以添加多个 messageListener,配置不同的交换机container.addMessageListener(messageListenerAdapter, new ChannelTopic(ConstantConfiguration.EXCHANGE_NAME));return container;}
}
  1. 订阅监听配置
/*** 订阅监听配置** @author 30346*/
@Slf4j
@Component
@Getter
@Setter
@Primary
public abstract class MessageSubListener implements MessageListener {private String channel;private String msg;@Autowiredprivate RedisUtil redisUtil;//该抽象方法是为了在微服务中多个项目可以使用抽离出来的redis发布订阅功能//其他不服中直接集成MessageSubListener并且重写onMessage即可public abstract void onMessage(String channel, String msg);@Overridepublic void onMessage(Message message, byte[] bytes) {channel = new String(bytes);RedisMessageBo redisMessageBo = JSONUtil.toBean(message.toString(), RedisMessageBo.class);msg = redisMessageBo.getMessage();//全局唯一id,为了解决集群下消息重复消费问题,我们在redis中存储了全局唯一id作为锁,过期将自动清楚String key = channel.concat(":").concat(redisMessageBo.getUuid());if (!redisUtil.hasKey(key)) {redisUtil.setEx(key, redisMessageBo.getMessage(), 60, TimeUnit.SECONDS);onMessage(channel, msg);}}
}
  1. 其他服务订阅监听配置
/*** 订阅监听配置** @author 30346*/
@Slf4j
@Component
public class DefaultMessageSubListener extends MessageSubListener {@Overridepublic void onMessage(String channel, String msg) {//业务逻辑}
}

发布一个消息

//初始化对象并设置全局唯一id和消息
RedisMessageBo redisMessageBo = new RedisMessageBo();
redisMessageBo.setUuid(UUID.randomUUID().toString(true));
redisMessageBo.setMessage(JSONUtil.toJsonStr(messageBo));
将消息发布到交换机上
stringRedisTemplate.convertAndSend(ConstantConfiguration.EXCHANGE_NAME, JSONUtil.toJsonStr(redisMessageBo));

注意

我们为了抽离发布订阅配置,默认创建了一个空的订阅监听器(保证在其他服务中不需要发布订阅是还可以正常启动),如果其他服务需要实现发布订阅则集成MessageSubListener实现一个订阅监听,并重写onMessage扩展业务逻辑。还有一点要关注一下,@Primary,由于默认创建了一个空的订阅监听器,当其他服务创建了自定义订阅监听器需要通过该注解标记让自定义的订阅监听器优先。

总结

常用的数据结构存储在这里就不讲了,上面主要讲解了redis发布订阅实现方案。


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

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

相关文章

elementor和divi的对比,哪个更适合你,他们国产化替代方案

Elementor和Divi都是流行的WordPress页面构建器&#xff0c;它们各自具有一些独特的优点和缺点。现在有越来越多的应用服务商开发了自助建站工具&#xff0c;通过自助建站工具&#xff0c;我们可以轻松的创建一个看起来很专业的网站。但在眼花缭乱的软件产品面前&#xff0c;我…

SpringMVC(三)【REST 风格】

1、REST 风格 1.1、REST 简介 REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表现形式状态转换 在开发中&#xff0c;它其实指的就是访问网络资源的格式 1.1.1、传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user…

数据结构——栈(C++实现)

数据结构——栈 什么是栈栈的实现顺序栈的实现链栈的实现 今天我们来看一个新的数据结构——栈。 什么是栈 栈是一种基础且重要的数据结构&#xff0c;它在计算机科学和编程中扮演着核心角色。栈的名称源于现实生活中的概念&#xff0c;如一叠书或一摞盘子&#xff0c;新添加…

【C++初阶】C++简单入门(长期维护)

本篇博客是对C的一些简单知识分享&#xff0c;有需要借鉴即可。 C简单入门目录 一、C前言1.C的概念&#xff1a;2.C发展历程3.C如何学&#xff1f; 二、C入门1.C关键字(C98标准)2.命名空间3.C输入&输出①概念说明②使用说明③特征说明④细节拓展⑤cout与cin的意义 4.缺省参…

处理json文件,并将数据汇总至Excel表格

从scores.jason文件中读取学生信息,输出学生的学号&#xff0c;姓名&#xff0c;各科成绩&#xff0c;平均分, 各科标准差 scores.jason {"学院": "计算机学院","班级": "2022级1班","成绩": [{"学号": 1001,&q…

【vue】绑定事件 v-on

v-on 简写&#xff1a; clickkeyupkeydownkeyup.wkeyup.ctrl.a <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

BK9534 博通BEKEN 无线麦克风芯片 提供配置工具软件

BK9534 芯片是在 BK9532 芯片基础上增加了一个内置MCU 来实现单芯片简单工作模式&#xff0c;内置己经固化了如开关机&#xff0c;对码&#xff0c;低电侦测&#xff0c;自动频率跟随等基本功能。另外还可以借助工具修改如频率&#xff0c;ID等相关配置信息. 1. 升级了接收芯片…

SpringBoot修改菜品模块开发

需求分析与设计 一&#xff1a;产品原型 在菜品管理列表页面点击修改按钮&#xff0c;跳转到修改菜品页面&#xff0c;在修改页面回显菜品相关信息并进行修改&#xff0c;最后点击保存按钮完成修改操作。 修改菜品原型&#xff1a; 二&#xff1a;接口设计 通过对上述原型图…

Midjourney常见玩法及prompt关键词技巧

今天系统给大家讲讲Midjourney的常见玩法和prompt关键词的一些注意事项&#xff0c;带大家入门&#xff5e;&#xff08;多图预警&#xff0c;建议收藏&#xff5e;&#xff09; 一、入门及常见玩法 1、注册并添加服务器&#xff08;会的童鞋可跳过&#xff5e;&#xff09; …

SpringBoot与MyBatisPlus的依赖版本冲突问题

记录使用SpringBoot和MyBatisPlus时遇到的版本冲突问题解决。 java版本&#xff1a;jdk17 废话&#xff1a;&#xff09;目前在IDEA中使用Spring官方的脚手架最低jdk版本竟然是jdk17了。 当使用SpringBoot3.0版本(3.2.4)&#xff0c;配合使用MP3.5.2版本时报错&#xff1a; Er…

H5代码video标签引入视频在浏览器的兼容性问题解决办法

H5标签video引入视频&#xff0c;在谷歌浏览器正常但是在火狐浏览器和版本较低的浏览器或者IE浏览器却无法观看视频&#xff0c;只能看到音频&#xff0c;是什么原因&#xff1f; 代码如下 <video class"video" muted loop"loop" style"display…

前端三剑客 —— JavaScript (第九节)

目录 内容回顾&#xff1a; 1.事件解除 2. Ajax jQuery选择器 回顾CSS选择器 CSS选择 1.基本选择器 2.包含选择器 3.伪类选择器 4.伪元素选择器 5.属性选择器 jQuery 库 jQuery 动画 系统动画 自定义动画 常见API操作 内容回顾&#xff1a; 1.事件解除 如果是使…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.3 月末操作:外币评估

2.6.3 月末操作&#xff1a;外币评估 企业的外币业务在记账时一般使用期初的汇率或者即时汇率&#xff0c;但在月末&#xff0c;需要按照月末汇率对外币的余额或者未清项进行重估&#xff08;revaluation&#xff09;。 企业在资产负债表日&#xff0c;应当按照下列规…

微信小程序全局配置

全局配置文件及常用的配置项 小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下&#xff1a; ① pages 记录当前小程序所有页面的存放路径 ② window 全局设置小程序窗口的外观 ③ tabBar 设置小程序底部的 tabBar 效果 ④ style 是否启用新版的组件样…

SpringBoot菜品分页查询模块开发(多表连接查询)

需要注意的地方 为什么创建VO类怎么进行多表连接查询分页查询的统一返回结果类PageResult分页查询Mapper的返回结果是Page<目标实体类> 需求分析与设计 一&#xff1a;产品原型 系统中的菜品数据很多的时候&#xff0c;如果在一个页面中全部展示出来会显得比较乱&…

华火电燃灶荣获国家级科技型中小企业

华火电燃灶作为一家国家级科技型中小企业&#xff0c;凭借其创新的技术和卓越的产品性能&#xff0c;在新能源厨电领域取得了显著的成就。华火&#xff0c;潜心钻研等离子电生明火技术近十年&#xff1b;华火电燃灶&#xff0c;电生明火&#xff0c;以“电”作为唯一能源&#…

创建影子用户

文章目录 1.认识影子用户2.创建隐藏账户并加入管理员组3.修改注册表3.删除用户4.添加管理员权限 1.认识影子用户 影子用户通常指的是那些在系统用户列表中不可见&#xff0c;但在某些情况下可以进行操作的用户。在内网渗透过程中&#xff0c;当我们拿到shell时&#xff0c;肯定…

uniapp--登录和注册页面-- login

目录 1.效果展示 2.源代码展示 测试登录 login.js 测试请求 request.js 测试首页index.js 1.效果展示 2.源代码展示 <template><view><f-navbar title="登录" navbarType="4"></f-navbar><view class="tips">…

碳课堂|碳关税是什么?企业如何从容应对?

2023年10月1日&#xff0c;欧盟碳边境调节机制&#xff08;CBAM&#xff09;法规&#xff0c;即全球首个“碳关税”开始实施。据世界银行研究报告称&#xff0c;如果“碳关税”全面实施&#xff0c;在国际市场上&#xff0c;中国制造可能将面临平均26%的关税&#xff0c;出口量…

李沐41_物体检测和数据集——自学笔记

边缘框 1.一个边缘框可以通过4个数字定义&#xff08;左上xy&#xff0c;右上xy&#xff0c;左下xy&#xff0c;右下xy&#xff09; 2.标注成本高 目标检测数据集 1.每行表示一个物体&#xff08;图片文件名、物体类别、边缘框&#xff09; 2.COCO&#xff1a;80物体、330…