首页 > 数据库 >Spring Cloud 集成 Redis

Spring Cloud 集成 Redis

时间:2024-04-09 20:59:34浏览次数:21  
标签:订阅 缓存 String Spring 配置 Redis Cloud

目录

前言

在当今的软件开发领域,分布式系统已经成为一种主流的架构模式,尤其是在处理大规模、高并发、高可用的业务场景时。然而,随着系统复杂性的增加,缓存机制的重要性也日益凸显。缓存不仅可以帮助我们减轻数据库压力,提高系统响应速度,还能在一定程度上保证系统的稳定性和可靠性。
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发布订阅实现方案。


标签:订阅,缓存,String,Spring,配置,Redis,Cloud
From: https://blog.csdn.net/qq_38036909/article/details/137567093

相关文章

  • redis 无盘复制(redis repl-diskless-sync)
    无盘复制的需求背景redis在启动后自动生成一个唯一的标识符run_id,这个run_id在持久化的时候存在于RDB文件中(如果有启用RDB或者做了RBD备份操作),但是并不存在与AOF文件中(包括混合是持久化文件),如果下次重启从RDB加载数据,那么这个run_id可以保存。如果同时启用了RDB和AOF持久化,redis......
  • Java基础知识-面向对象编程(OOP)-Java集合框架-多线程和并发-Spring框架
    Java基础知识:Java的四种基本数据类型是:byte、short、int、long(整数类型)、float、double(浮点类型)、char(字符类型)、boolean(布尔类型)。它们之间的区别主要在于占用的内存大小和表示范围不同。Java中的String是不可变的意味着一旦String对象被创建,它的值就不能被修改。这意味着St......
  • springboot3使用自定义注解+AOP+redis优雅实现防重复提交
     ⛰️个人主页:   蒾酒......
  • Spring Boot、Nacos配置文件properties、yml、yaml的优先级
    在标准的SpringBoot应用中,本地配置加载顺序如下:bootstrap.yamlbootstrap.propertiesbootstrap-{profile}.yamlbootstrap-{profile}.propertiesapplication.yamlapplication.propertiesapplication-{profile}.yamlapplication-{profile}.propertiesnacos配置中心共享......
  • 在docker部署fastapi宝塔里使用nginx反代套上cloudflare获取请求的真实ip
    在docker部署fastapi宝塔里使用nginx反代套上cloudflare获取请求的真实ip背景是这样的,我使用docker部署了一个fastapi部署了一个应用,使用request.client.host获取请求的来源ip,但是获取到的都是172.17.0.1这显然是不是正常的,是docker网络下的ip,所以我们需要在nginx进行设置转发......
  • Spring Security——13,认证成功&&失败&&注销成功处理器
    认证成功&&失败&&注销成功处理器说明:一、认证成功处理器1.1自定义成功处理器1.2配置自定义成功处理器二、认证失败处理器2.1自定义失败处理器2.2配置自定义失败处理器三、登出成功处理器3.1自定义登出处理器3.2配置登出处理器四、完结撒花一键三连有没有捏~~......
  • 【spring】@Scope注解学习
    @Scope介绍@Scope注解是Spring框架中用于指定bean作用域的注解。在Spring中,一个bean的作用域定义了该bean的生命周期和创建bean实例的上下文。Spring提供了几种预定义的作用域,同时也支持自定义作用域。通过使用@Scope注解,开发者可以更精确地控制Spring容器如何创建和维护bean......
  • Spring AOP 技术详解
    学完AOP技术,真的不得不佩服发明AOP技术的人,真是个天才!!!想要了解AOP,首先要了解什么叫代理。1.代理我们先来说说什么叫做代理:        假如我要买辆奥迪A7,我不会直接去长春一汽工厂去买,为啥?路途远,而且,如果以这样方式购买,一手交钱,一手交车,事先没人给我介绍车辆配置情况......
  • 改进NeteaseCloudMusicGtk4:添加移除歌曲按钮
    之前已经发了一篇博客简述了如何阅读这个项目,尽管这个项目已经开源很久了,但我找了很久都没有找到怎么从播放列表移除歌曲,那就自己动手实现,再提个PR吧。运行起来应用后通过Inspector(Ctrl+Shift+I)找到希望放置按钮的位置:专辑按钮的旁边。第一步就是修改UI文件,把这个按钮显示出......
  • 两种方式实现SpringBoot脚手架的依赖配置
    在基于SpringBoot脚手架创建项目时,通常会直接将spring-boot-starter-parent作为<parent>,如下示例:<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</vers......