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.hqwc.cn/news/624246.html

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

相关文章

GitHub提交PR

本教程只做开源代码库Github工程提交pr的教程&#xff0c;不做其他的深入的讲解 Github和Gitlab的操作类似&#xff0c;只不过Github叫PR&#xff0c;GitLab叫MR&#xff0c;基本上做法是一致的 以开源项目QuickChat为例 https://github.com/Binx98/QuickChat https://github…

移动硬盘盒支持PD充电:优势解析与实际应用探讨

随着科技的飞速发展&#xff0c;数据存储和传输的需求日益增长&#xff0c;移动硬盘盒作为便携式存储设备的重要载体&#xff0c;其功能和性能也在不断提升。近年来&#xff0c;越来越多的移动硬盘盒开始支持PD&#xff08;Power Delivery&#xff09;充电技术&#xff0c;这一…

5种方法,教你如何清理接口测试后的测试数据

在接口测试之后&#xff0c;清理测试数据是一个很重要的步骤&#xff0c;以确保下一次测试的准确性和一致性。以下是一些常见的测试数据清理方法&#xff1a; 1. 手动清理&#xff1a; 这是最基本的方法&#xff0c;即手动删除或重置测试数据。您可以通过访问数据库、控制台或…

文献速递:深度学习胰腺癌诊断--胰腺癌在CT扫描中通过深度学习检测:一项全国性的基于人群的研究

Title 题目 Pancreatic Cancer Detection on CT Scans with Deep Learning: A Nationwide Population-based Study 胰腺癌在CT扫描中通过深度学习检测&#xff1a;一项全国性的基于人群的研究 01 文献速递介绍 胰腺癌&#xff08;PC&#xff09;的五年生存率是所有癌症中…

预分频器×重装载值)/LSI频率 为什么等于总时间

1. 第一种算法理解&#xff1a;分频系数 64 &#xff0c;外部低速时钟40khz&#xff0c; 则一次计数周期1.6ms &#xff0c;计数625个数&#xff0c;则有625个周期 &#xff0c;1.6ms*625 等于1s 如果分频系数是64&#xff0c;外部低速时钟&#xff08;LSI&#xff09;频率是…

网络爬虫:定义、应用及法律道德考量

网络爬虫技术在当今数据驱动的世界中发挥着重要作用。本文将从网络爬虫的定义和主要功能&#xff0c;其在业界的应用实例&#xff0c;以及涉及的法律和道德问题三个方面进行深入探讨。 1. 爬虫的定义和主要功能 网络爬虫&#xff0c;也称为网页爬虫或蜘蛛&#xff0c;是一种…

【Entity Framework】你必须要了解EF中数据查询之数据加载

【Entity Framework】你必须要了解EF中数据查询之数据加载 文章目录 【Entity Framework】你必须要了解EF中数据查询之数据加载一、概述二、预先加载2.1 包含多个层级2.2 经过筛选的包含 三、显示加载3.1查询关联实体 四、延时加载4.1 不使用代理进行延迟加载 一、概述 Entity…

C++命名空间在内部声明函数,在外部定义函数

C命名空间在内部声明函数&#xff0c;在外部定义函数 #include <iostream> namespace A {int a;void func(); } void A::func() {std::cout << "Hello World!" << std::endl; } void main() {A::func(); }实际运行的代码和结果图如下&#xff1a;…

Rust腐蚀服务器修改背景和logo图片操作方法

Rust腐蚀服务器修改背景和logo图片操作方法 大家好我是艾西一个做服务器租用的网络架构师。在我们自己搭建的rust服务器游戏设定以及玩法都是完全按照自己的想法设定的&#xff0c;如果你是一个社区服那么对于进游戏的主页以及Logo肯定会有自己的想法。这个东西可以理解为做一…

4.16学习总结

MySQL数据库学习(一) 一.MySQL数据库的基本知识 (一).数据库 概念&#xff1a;数据仓库,软件,安装在操作系统之上 作用&#xff1a;存储数据&#xff0c;管理数据 (二).数据库的分类 关系型数据库&#xff1a;SQL&#xff08;Structured Query Language&#xff09; MySQL…

基于Docker构建CI/CD工具链(七)使用Jmeter进行自动化压测

上一篇文章中&#xff0c;我们详细介绍了构建 Apifox Cli 的 Docker 镜像的步骤&#xff0c;并通过简单的示例演示了如何利用 GitLab 的 CI/CD 功能&#xff0c;将构建好的镜像利用在自动化测试作业中。在今天的文章中&#xff0c;我们将重点讨论如何构建 JMeter 的 Docker 镜像…

cesium 解决带高度的polygon 材质不能透明的问题

问题描述&#xff1a;创建一个带高度的polygon&#xff0c;用一个带透明度的图片做材质&#xff0c;画出来的多边形没有透明效果&#xff0c;图片的透明通道没有用上。 一、创建不带高度polygon 不带高度的polygon&#xff0c;使用带透明度的图片是有效果的&#xff0c;但是不…