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}
     */
    @Bean
    MessageListenerAdapter listenerAdapter(MessageSubListener receiver) {
        return new MessageListenerAdapter(receiver);
    }
}
  1. 发布监听配置
/**
 * 发布监听配置
 *
 * @author 30346
 */
@Configuration
public class RedisPubListenerConfig {

    @Bean
    RedisMessageListenerContainer 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;

    @Autowired
    private RedisUtil redisUtil;

    //该抽象方法是为了在微服务中多个项目可以使用抽离出来的redis发布订阅功能
    //其他不服中直接集成MessageSubListener并且重写onMessage即可
    public abstract void onMessage(String channel, String msg);

    @Override
    public 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 {

    @Override
    public 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发布订阅实现方案。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20从0开始选择合适版本手动安装cuda,torch-geometric,jax

一个全新的ubuntu20台式机&#xff0c;在Additional Drivers安装nvidia-470-server&#xff08;一开始安装450&#xff0c;cunda版本只能到11.0&#xff0c;torch有些库用不了&#xff0c;可以直接切换点击Apply Changes重启就行&#xff09; nvidia-smi查看CUDA Version可到…

Java基础_22线程死锁,object类下面线程方法,生产者消费者

周二的回顾 1.线程的概念是进程(应用程序软件)最小的基本单位 2.在Java中代码咋写线程1.继承Thread类2.实现Runnable接口3.实现Callable接口 3.Thread相关的方法4.同步锁目的: 当多个线程操作同一个资源的时候&#xff0c;会发生数据不安全性&#xff01;&#xff01;&#x…

Jenkins上面使用pnpm打包

问题 前端也想用Jenkins的CI/CD工作流。 步骤 Jenkins安装NodeJS插件 安装完成&#xff0c;记得重启Jenkins。 全局配置nodejs Jenksinfile pipeline {agent anytools {nodejs "18.15.0"}stages {stage(Check tool version) {steps {sh node -vnpm -vnpm config…

[温故] 红黑树算法

前言 最近在突然想起一些基础的东西, 向着温故知新, 有了些新的感悟和大家分享一下. 排序算法是数据结构的一个重要组成部分, 当时学习的时候没有少折腾, 这里来看看大佬们怎么运用这些数据结构来构建庞大的计算机体系的. 二叉树是排序算法的一个衍生, 基于二叉树的构建不同…

阿里Canal使用

Canal 是阿里巴巴开源的一款基于 MySQL 数据库增量日志解析&#xff0c;提供实时的数据订阅和消费服务的工具。它可以用来读取 MySQL 的 binlog 日志并转换成 JSON 格式的事件消息&#xff0c;然后将这些消息发布到下游的消息中间件&#xff0c;比如 RabbitMQ&#xff0c;以实现…

重磅消息:CnosDB 文档网站升级全新框架啦!

我们很高兴地宣布&#xff0c;CnosDB 文档网站迎来了一次重大升级&#xff01;现在&#xff0c;我们采用了全新的强大的开源文档框架&#xff0c;为用户提供更流畅、更直观的浏览体验。 全新框架带来的优势&#xff1a; 更快速的加载速度&#xff1a;现在您可以更快地访问并查…

【Linux】磁盘扩容到根目录逻辑卷(LVM)

目录 一、物理卷和逻辑卷 1.物理卷和逻辑卷的区别 2.在Linux系统中查看所有物理卷的信息 3.在Linux系统中查看所有逻辑卷的信息 二、文件系统 三、实操-对root&#xff08;/&#xff09;目录进行扩容 1.使用lsblk命令查看新加入的磁盘信息 2.fdisk -l命令查看系统中磁盘…

【切换网络连接后】VMware虚拟机网络配置【局域网通信】

初次安装Linux虚拟机以及切换网络都需要配置虚拟机网络&#xff0c; 从而使得win主机内通过远程连接工具能够连接该虚拟机&#xff0c; 而不是在虚拟机内操作。 本片文章你将了解到网络切换后如何配置虚拟机网络的一些基础操作&#xff0c;以及局域网通信的一些基础知识。 …

HTTP/1.1特性总结

优点 【简单&#xff0c;灵活和易于扩展&#xff0c;应用广泛和跨平台】 1.简单&#xff1a; http基本的报文格式就是headerbody&#xff0c;头部信息也是key-value简单的文本形式&#xff0c;易于理解&#xff0c;降低了学习和使用的门槛 2.灵活和易于扩展&#xff1a; &…

电动汽车退役锂电池SOC主动均衡控制MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 仿真简介 模型选用双向反激变换器作为主动均衡拓扑电路&#xff0c;均衡策略采用基于SOC的主动均衡策略&#xff0c;旨在解决电动汽车退役锂电池的不一致性问题。模型选用双向反激变换器作为主动均衡拓扑电路…

基于小程序实现的餐饮外卖系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

HTML图片标签和超链接标签

目录 图片标签 图片路径属性 图片替换文本属性 图片宽度和高度属性 图片边框属性 图片提示属性 超链接标签 链接属性 跳转方式属性 图片标签 在HTML中&#xff0c;可以使用<img>标签为网页添加图片 在HTML中&#xff0c;使用图片标签一般包含下面的四个属性 …

雨云免费云服务器领取步骤详解

随着云计算技术的日益普及&#xff0c;越来越多的用户开始选择使用云服务器来满足他们的数据存储和计算需求。雨云作为一家具有自主知识产权的国产云计算服务提供商&#xff0c;其免费云服务器服务备受关注。接下来&#xff0c;本文将为大家详细介绍雨云免费云服务器的领取步骤…

供应链金融机器学习建模实战

随着全球贸易的不断发展和供应链的日益复杂化&#xff0c;供应链金融作为一种新型金融工具&#xff0c;正逐渐受到企业和金融机构的关注和重视。供应链金融是指通过金融手段来优化和改进供应链中的资金流动和货物流动&#xff0c;以实现企业间的合作共赢。 供应链金融的核心是将…

STM32之HAL开发——CubeMX配置串行Flash文件系统

配置流程 在开始配置FATFS前&#xff0c;需要提前配置好RCC的时钟&#xff0c;以及时钟的频率&#xff0c;另外还要配置好Debug选项&#xff08;选择串行&#xff09; 选项介绍 文件系统适用于SD卡&#xff0c;Disk磁盘等&#xff0c;需要我们将对应的驱动打开才可以使用。 …

Sonatype Nexus 的使用参数

在最近安装的 Sonatype Nexus 版本中提供了一个使用参数情况界面。 这个使用情况的界面主要是针对当前 Sonatype Nexus 的安装实例出现的系统接入和调用情况。 上面提供了一个限制&#xff0c;这个限制不是说达到了限制后拒绝提供服务了&#xff0c;而是因为在默认的 Sonatype…

java二维数组

一、二维数组的概述&#xff1a; 目录 二维数组的概述&#xff1a; 二维数组图解&#xff1a; 二维数组的四种创建方式&#xff1a; Java 用sort对二维数组进行排序 二维数组简单概述&#xff1a;Java中的二维数组一般应用在矩阵的一些运算、棋盘游戏中棋盘的实现、二维数据…

vue3+vite+typescript+pinia+element_plus构建web项目

1.vite搭建 yarn create vite 可能会提示node版本不支持&#xff0c;需要根据提示升级或降级node版本 使用nvm下载对应版本 nvm download 18.x.xnvm use 18.x.x// 需要安装yarn npm install -g yarn// 重新执行 yarn create vite 过程中会提供选择&#xff0c;分别选择vue、…

三个晚上!给干废了!MINI2440 挂载 NFS

虚拟机执行&#xff1a;sudo ifconfig tap0 10.10.10.1 up qemu 开发板&#xff1a; set bootargs noinitrd root/dev/nfs rw nfsroot10.10.10.1:/nfsroot ip10.10.10.10:10.10.10.1 ::255.255.255.0 consolettySAC0,115200 Hit any key to stop autoboot: 0 MINI2440 # set…

VMware 虚拟机中的 Ubuntu 16.04 设置 USB 连接

VMware 虚拟机中的 Ubuntu 16.04 设置 USB 连接 1. VMware USB Arbitration Service2. 可移动设备 USB 口连接主机3. 虚拟机 -> 可移动设备 -> 连接 (断开与主机的连接)4. 状态栏 -> 断开连接 (连接主机)References 1. VMware USB Arbitration Service 计算机 -> …