SpringBoot配置多个Redis数据源

该博客介绍了Spring Boot整合Redis的实现步骤,包括导入依赖、编写配置信息、编写RedisManager以及进行测试,还提供了参考链接。

1. 导入依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.9.0</version>
        </dependency>

2.编写配置信息

redisManagement:
  dbnum: 2
  redis1:
    database: 0
    host: localhost
    password:
    port: 6379
    timeout: 0
  redis2:
    database: 1
    host: localhost
    password:
    port: 6379
    timeout: 0

3. 编写RedisManager

@Configuration
public class RedisManagment {
    Logger logger = LogManager.getLogger(RedisManagment.class);

    @Value("${redisManagement.dbnum}")
    private int maxnum;

    @Autowired
    private Environment environment;

    @Bean("redisConnections")
    public StringRedisTemplate[] RedisConnections(){
        logger.info("###### START 初始化 Redis 连接池 START ######");
        StringRedisTemplate[] dbs = new StringRedisTemplate[maxnum];
        for (int i = 0; i < maxnum; i++) {
            String pre = "redisManagement.redis"+(i+1)+".";
            dbs[i] = redisTemplateObject(i,environment.getProperty(pre+"host"),environment.getProperty(pre+"password"),
                    environment.getProperty(pre+"port",Integer.class));
        }
        logger.info("###### END 初始化 Redis 连接池 END ######");
        return dbs;
    }

    private StringRedisTemplate redisTemplateObject(Integer dbIndex,String host,String pwd,int port) {
        StringRedisTemplate redisTemplateObject = new StringRedisTemplate();
        redisTemplateObject.setConnectionFactory(redisConnectionFactory(jedisPoolConfig(), dbIndex,host,pwd,port));
        setSerializer(redisTemplateObject);
        redisTemplateObject.afterPropertiesSet();
        return redisTemplateObject;
    }

    /**
     * 连接池配置信息
     */
    private JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);
        poolConfig.setTestWhileIdle(true);
        poolConfig.setNumTestsPerEvictionRun(10);
        poolConfig.setTimeBetweenEvictionRunsMillis(60000);
        // 当池内没有可用的连接时,最大等待时间
        poolConfig.setMaxWaitMillis(10000);
        // ------其他属性根据需要自行添加-------------
        return poolConfig;
    }

    /**
     * jedis连接工厂
     */
    private RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig, int db,String hostName,String passWord,int port) {
        // 单机版jedis
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        // 设置redis服务器的host或者ip地址
        redisStandaloneConfiguration.setHostName(hostName);
        // 设置默认使用的数据库
        redisStandaloneConfiguration.setDatabase(db);
        // 设置密码
        redisStandaloneConfiguration.setPassword(RedisPassword.of(passWord));
        // 设置redis的服务的端口号
        redisStandaloneConfiguration.setPort(port);

        // 获得默认的连接池构造器
        JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration
                .builder();
        // 指定jedisPoolConifig来修改默认的连接池构造器)
        jpcb.poolConfig(jedisPoolConfig);
        // 通过构造器来构造jedis客户端配置
        JedisClientConfiguration jedisClientConfiguration = jpcb.build();
        // 单机配置 + 客户端配置 = jedis连接工厂
        JedisConnectionFactory factory = new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
        //JedisConnectionFactory需要调用AfterProperties初始化
        factory.afterPropertiesSet();
        return factory;
    }

    /**
     * 设置序列化
     */
    private void setSerializer(StringRedisTemplate template) {
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    }

}

4. 测试

@SpringBootTest
class SellcloudApplicationTests {
    @Resource(name = "redisConnections")
    StringRedisTemplate[] templates;

    @Test
    void EnvironmentTest(){
        templates[0].delete("hzkey");
        templates[1].delete("hzkey");
        for (int i = 0; i < templates.length; i++) {
            StringRedisTemplate db = templates[i];
            System.out.println(db.opsForValue().get("hzkey"));
            db.opsForValue().set("hzkey","hzvalue");
            System.out.println(db.opsForValue().get("hzkey"));
        }
    }
}

参考链接:https://blog.youkuaiyun.com/jjjackjack/article/details/122959435

<think>嗯,用户想在Spring Boot里用Lettuce配置多个Redis连接。我得先回忆一下相关的配置方法。首先,我记得在Spring Boot中,默认的Redis配置是通过spring.redis开头的属性来设置的,但只能配置一个数据源。那如果要多个的话,可能需要手动配置多个连接工厂和模板。 根据引用[2]提到的内容,配置多个Redis数据源需要创建多个配置类,每个配置类对应不同的Redis实例。可能需要使用@Configuration和@Bean注解来定义不同的LettuceConnectionFactory和RedisTemplate。同时,引用[5]中的配置示例展示了单个Redis配置参数,比如host、port和连接池设置,这些可以作为参考。 然后,Lettuce的ClientResources是否共享呢?引用[3]提到,ClientResources可以在多个客户端之间共享,但如果是连接不同的Redis服务器,可能需要分开。所以,在配置多个连接工厂时,可能需要为每个工厂设置独立的ClientResources或者共享,根据实际情况决定。 接下来,具体的步骤应该是:首先排除默认的自动配置,避免冲突。然后为每个Redis数据源创建配置类,分别设置不同的连接参数,比如host、port、database等。每个配置类里定义LettuceConnectionFactory,并指定不同的配置前缀。接着,为每个连接工厂创建对应的RedisTemplate和StringRedisTemplate,并设置不同的bean名称。 可能还需要在application.properties里添加多个配置,比如redis1.host和redis2.host,这样每个配置类读取不同的属性。同时,连接池的配置也要分开,可能需要使用spring.redis.lettuce.pool或者自定义的属性。 然后,用户在使用的时候,可以通过@Qualifier注解来注入不同的RedisTemplate,这样就能区分不同的数据源了。比如在Service层注入primaryRedisTemplate和secondaryRedisTemplate,分别操作不同的Redis实例。 需要注意的是,如果多个连接工厂使用不同的数据库索引或者不同的服务器,要确保配置正确。另外,关于连接池的参数,如max-active、max-idle等,每个数据源可能需要独立配置,避免资源竞争或者不足。 可能的问题点:是否需要在配置类里显式设置ClientResources?根据引用[3],如果多个客户端需要共享资源,可以共享,但如果是不同的Redis服务,可能不需要。所以默认情况下,可能每个连接工厂会自动创建自己的ClientResources,不需要特别处理。 最后,给出一个示例代码结构,展示如何定义两个配置类,读取不同的属性,并生成对应的Bean。同时,在application.properties里配置两个数据源的参数。这样用户就能根据示例进行配置了。</think>在Spring Boot配置多个Lettuce Redis客户端需要手动创建多个连接工厂和模板对象,以下是具体实现步骤及示例: ### 一、配置数据源步骤 1. **禁用默认自动配置** 在启动类添加注解排除默认Redis配置: ```java @SpringBootApplication(exclude = {RedisAutoConfiguration.class}) ``` 2. **配置第一个Redis数据源** ```java @Configuration @ConfigurationProperties(prefix = "redis.primary") public class PrimaryRedisConfig { private String host; private int port; private int database; private Pool pool; @Bean(name = "primaryConnectionFactory") public LettuceConnectionFactory primaryConnectionFactory() { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port); config.setDatabase(database); LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder() .commandTimeout(Duration.ofMillis(1000)) .poolConfig(pool.getLettucePoolConfig()) .build(); return new LettuceConnectionFactory(config, clientConfig); } @Bean(name = "primaryRedisTemplate") public RedisTemplate<String, Object> primaryRedisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(primaryConnectionFactory()); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); return template; } // Getter/Setter省略 } ``` 3. **配置第二个Redis数据源** ```java @Configuration @ConfigurationProperties(prefix = "redis.secondary") public class SecondaryRedisConfig { // 结构同PrimaryRedisConfig,修改bean名称即可 @Bean(name = "secondaryConnectionFactory") public LettuceConnectionFactory secondaryConnectionFactory() {...} @Bean(name = "secondaryRedisTemplate") public RedisTemplate<String, Object> secondaryRedisTemplate() {...} } ``` ### 二、配置文件示例 ```properties # 主Redis配置 redis.primary.host=192.168.1.100 redis.primary.port=6379 redis.primary.database=0 redis.primary.pool.max-active=8 redis.primary.pool.max-idle=8 # 从Redis配置 redis.secondary.host=192.168.1.101 redis.secondary.port=6380 redis.secondary.database=1 redis.secondary.pool.max-active=5 redis.secondary.pool.max-idle=5 ``` ### 三、使用方式 ```java @Service public class RedisService { @Autowired @Qualifier("primaryRedisTemplate") private RedisTemplate<String, Object> primaryTemplate; @Autowired @Qualifier("secondaryRedisTemplate") private RedisTemplate<String, Object> secondaryTemplate; public void saveData() { primaryTemplate.opsForValue().set("key1", "value1"); secondaryTemplate.opsForHash().put("hash1", "field1", "value2"); } } ``` **关键技术点说明**: 1. 通过`@ConfigurationProperties`实现配置隔离 2. 使用不同`@Bean`名称区分实例 3. 连接池配置通过`LettucePoolingClientConfiguration`实现[^5] 4. 序列化器统一使用`StringRedisSerializer`保证数据可读性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值