锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. Spring Boot 整合多 Redis 数据源配置及操作

Spring Boot 整合多 Redis 数据源配置及操作

0
  • 软件开发
  • 发布于 2024-08-16
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

Spring Boot 整合多 Redis 数据源配置及操作

简介

本文档介绍了如何在 Spring Boot 应用程序中配置和操作多个 Redis 数据源。通过配置多个 RedisConnectionFactory 和 RedisTemplate,可以实现对多个 Redis 数据源的整合,以便在应用程序中灵活地使用不同的 Redis 实例。

以下是本文档的主要内容:

  • 添加依赖:介绍了在 pom.xml 文件中添加 Spring Boot 和 Redis 相关依赖的步骤。
  • 配置多个 Redis 数据源:说明了如何在 application.properties 或 application.yml 中配置多个 Redis 数据源的连接信息。
  • 创建多个 RedisConnectionFactory:展示了在配置类中创建多个 RedisConnectionFactory 的 Bean,并分别指定不同连接信息的步骤。
  • 创建多个 RedisTemplate:介绍了根据不同的 RedisConnectionFactory 创建对应的 RedisTemplate 的步骤。
  • 使用多个 RedisTemplate 进行操作:说明了在需要使用 Redis 的地方,如何注入对应的 RedisTemplate,并使用它们来操作不同的 Redis 数据源。

通过本文档的指导,您将能够轻松地在 Spring Boot 应用程序中实现对多个 Redis 数据源的整合配置和操作,从而满足不同业务场景下对多个 Redis 实例的需求。

代码实现

配置 POM 依赖

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

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

配置多个 Redis 数据源

spring:
  redis:
    host: localhost
    port: 6379
    database: 0
    password: 123456
    lettuce: # 使用Lettuce作为Redis的客户端
      pool: # 连接池
        max-active: 32 # 最大的活跃连接数
        max-wait: 300 # 获取连接的最大等待时间
        max-idle: 16 # 最大的空闲连接数
        min-idle: 8 # 最小的空闲连接数
  redis-node02:
    host: localhost
    port: 6379
    database: 1
    password: 123456
    lettuce:
      pool:
        max-active: 16
        max-wait: 100
        max-idle: 8
        min-idle: 4

创建多个 Redis 连接配置

  • 读取配置信息
  • 初始化 ConnectionFactory
  • 创建 RedisTemplate 实例
@Configuration
public class RedisAutoConfig {

    @Bean
    @Primary
    public LettuceConnectionFactory defaultLettuceConnectionFactory(RedisStandaloneConfiguration defaultRedisConfig,
                                                                    GenericObjectPoolConfig defaultPoolConfig) {
        LettuceClientConfiguration clientConfig =
                LettucePoolingClientConfiguration.builder().commandTimeout(Duration.ofMillis(100))
                        .poolConfig(defaultPoolConfig).build();
        return new LettuceConnectionFactory(defaultRedisConfig, clientConfig);
    }

    @Bean
    public RedisTemplate<String, String> defaultRedisTemplate(
            @Qualifier("defaultLettuceConnectionFactory") LettuceConnectionFactory defaultLettuceConnectionFactory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(defaultLettuceConnectionFactory);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    @Bean
    @ConditionalOnBean(name = "node02RedisConfig")
    public LettuceConnectionFactory node02LettuceConnectionFactory(RedisStandaloneConfiguration node02RedisConfig,
                                                                    GenericObjectPoolConfig node02PoolConfig) {
        LettuceClientConfiguration clientConfig =
                LettucePoolingClientConfiguration.builder().commandTimeout(Duration.ofMillis(100))
                        .poolConfig(node02PoolConfig).build();
        return new LettuceConnectionFactory(node02RedisConfig, clientConfig);
    }

    @Bean
    @ConditionalOnBean(name = "node02LettuceConnectionFactory")
    public RedisTemplate<String, String> node02RedisTemplate(
            @Qualifier("node02LettuceConnectionFactory") LettuceConnectionFactory node02LettuceConnectionFactory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(node02LettuceConnectionFactory);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    /**
     * 默认配置
     */
    @Configuration
    public static class DefaultRedisConfig {
        @Value("${spring.redis.host:127.0.0.1}")
        private String host;
        @Value("${spring.redis.port:6379}")
        private Integer port;
        @Value("${spring.redis.password:}")
        private String password;
        @Value("${spring.redis.database:0}")
        private Integer database;

        @Value("${spring.redis.lettuce.pool.max-active:8}")
        private Integer maxActive;
        @Value("${spring.redis.lettuce.pool.max-wait:-1}")
        private Long maxWait;
        @Value("${spring.redis.lettuce.pool.max-idle:8}")
        private Integer maxIdle;
        @Value("${spring.redis.lettuce.pool.min-idle:0}")
        private Integer minIdle;

        @Bean
        public GenericObjectPoolConfig defaultPoolConfig() {
            GenericObjectPoolConfig config = new GenericObjectPoolConfig();
            config.setMaxTotal(maxActive);
            config.setMaxWaitMillis(maxWait);
            config.setMaxIdle(maxIdle);
            config.setMinIdle(minIdle);
            return config;
        }

        @Bean
        public RedisStandaloneConfiguration defaultRedisConfig() {
            RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
            config.setHostName(host);
            config.setPort(port);
            config.setPassword(RedisPassword.of(password));
            config.setDatabase(database);
            return config;
        }
    }

    /**
     * Node02配置
     */
    @Configuration
    public static class Node02RedisConfig {
        @Value("${spring.redis-node02.host:127.0.0.1}")
        private String host;
        @Value("${spring.redis-node02.port:6379}")
        private Integer port;
        @Value("${spring.redis-node02.password:}")
        private String password;
        @Value("${spring.redis-node02.database:0}")
        private Integer database;

        @Value("${spring.redis-node02.lettuce.pool.max-active:8}")
        private Integer maxActive;
        @Value("${spring.redis-node02.lettuce.pool.max-wait:-1}")
        private Long maxWait;
        @Value("${spring.redis-node02.lettuce.pool.max-idle:8}")
        private Integer maxIdle;
        @Value("${spring.redis-node02.lettuce.pool.min-idle:0}")
        private Integer minIdle;

        @Bean
        public GenericObjectPoolConfig node02PoolConfig() {
            GenericObjectPoolConfig config = new GenericObjectPoolConfig();
            config.setMaxTotal(maxActive);
            config.setMaxWaitMillis(maxWait);
            config.setMaxIdle(maxIdle);
            config.setMinIdle(minIdle);
            return config;
        }

        @Bean
        public RedisStandaloneConfiguration node02RedisConfig() {
            RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
            config.setHostName(host);
            config.setPort(port);
            config.setPassword(RedisPassword.of(password));
            config.setDatabase(database);
            return config;
        }
    }
}

如果不借助@Primary来指定默认的连接工厂,就会报错如下打印信息:

Description:

Parameter 0 of method reactiveRedisTemplate in org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration required a single bean, but 2 were found:
	- defaultLettuceConnectionFactory: defined by method 'defaultLettuceConnectionFactory' in class path resource [com/itwenke/springbootdemo/redismultiple/config/RedisAutoConfig.class]
	- node02LettuceConnectionFactory: defined by method 'node02LettuceConnectionFactory' in class path resource [com/itwenke/springbootdemo/redismultiple/config/RedisAutoConfig.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

使用多个 RedisTemplate 进行操作

  • 写操作
  • 读操作
@RestController
@RequestMapping(path = {"api/test"})
public class TestController {

    @Resource
    private RedisTemplate<String, String> defaultRedisTemplate;

    @Resource
    private RedisTemplate<String, String> node02RedisTemplate;

    @GetMapping(path = "set")
    public void set() {
        defaultRedisTemplate.opsForValue().set("key1", "value1");
        node02RedisTemplate.opsForValue().set("key2", "value2");
    }

    @GetMapping(path = "get")
    public void get() {
        String value1 = defaultRedisTemplate.opsForValue().get("key1");
        String value2 = node02RedisTemplate.opsForValue().get("key2");
        System.out.println("value1 = " + value1 + ", value2 = " + value2);
    }

}

开始测试

查询数据库

数据库 0 和 1 都为空,因为还没添加数据

执行 set 写操作

http://localhost:8080/api/test/set

可以查看到数据库 0 和 1 都添加了对应的数据

执行 get 读操作

http://localhost:8080/api/test/get

控制台打印信息:value1 = value1, value2 = value2

标签: #软件开发 1171 #JAVA 991 #Spring Boot 173
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.