| 
 | 
 
springboot如何连接不同序号的redis数据库,即连接多个不同的数据库 
给两个 Redis 连接工厂,分别指向不同的 DB,再各自绑定到不同的 RedisTemplate。 
- package com.example.config;
 
  
- import org.springframework.beans.factory.annotation.Qualifier;
 
 - import org.springframework.beans.factory.annotation.Value;
 
 - import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
 
 - import org.springframework.boot.context.properties.EnableConfigurationProperties;
 
 - import org.springframework.context.annotation.*;
 
 - import org.springframework.data.redis.connection.*;
 
 - import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
 
 - import org.springframework.data.redis.core.RedisTemplate;
 
 - import org.springframework.data.redis.serializer.*;
 
  
- @Configuration
 
 - @EnableConfigurationProperties(RedisProperties.class)
 
 - public class RedisMultiDbConfig {
 
  
-     // JSON/String 对象用的连接(DB=app.redis.json-database,默认0)
 
 -     @Primary
 
 -     @Bean("jsonConnectionFactory")
 
 -     public LettuceConnectionFactory jsonConnectionFactory(
 
 -             RedisProperties props,
 
 -             @Value("${app.redis.json-database:0}") int db) {
 
 -         RedisStandaloneConfiguration cfg = new RedisStandaloneConfiguration(props.getHost(), props.getPort());
 
 -         if (props.getPassword() != null) cfg.setPassword(RedisPassword.of(props.getPassword()));
 
 -         cfg.setDatabase(db);
 
 -         return new LettuceConnectionFactory(cfg);
 
 -     }
 
  
-     // 二进制用的连接(DB=app.redis.binary-database,默认1)
 
 -     @Bean("binaryConnectionFactory")
 
 -     public LettuceConnectionFactory binaryConnectionFactory(
 
 -             RedisProperties props,
 
 -             @Value("${app.redis.binary-database:1}") int db) {
 
 -         RedisStandaloneConfiguration cfg = new RedisStandaloneConfiguration(props.getHost(), props.getPort());
 
 -         if (props.getPassword() != null) cfg.setPassword(RedisPassword.of(props.getPassword()));
 
 -         cfg.setDatabase(db);
 
 -         return new LettuceConnectionFactory(cfg);
 
 -     }
 
  
-     // JSON 模板(默认注入)
 
 -     @Primary
 
 -     @Bean
 
 -     public RedisTemplate<String, Object> redisTemplate(
 
 -             @Qualifier("jsonConnectionFactory") RedisConnectionFactory cf) {
 
 -         RedisTemplate<String, Object> t = new RedisTemplate<>();
 
 -         t.setConnectionFactory(cf);
 
 -         t.setKeySerializer(StringRedisSerializer.UTF_8);
 
 -         t.setHashKeySerializer(StringRedisSerializer.UTF_8);
 
 -         GenericJackson2JsonRedisSerializer json = new GenericJackson2JsonRedisSerializer();
 
 -         t.setValueSerializer(json);
 
 -         t.setHashValueSerializer(json);
 
 -         t.afterPropertiesSet();
 
 -         return t;
 
 -     }
 
  
-     // 二进制模板(value=byte[])
 
 -     @Bean("binaryRedisTemplate")
 
 -     public RedisTemplate<String, byte[]> binaryRedisTemplate(
 
 -             @Qualifier("binaryConnectionFactory") RedisConnectionFactory cf) {
 
 -         RedisTemplate<String, byte[]> t = new RedisTemplate<>();
 
 -         t.setConnectionFactory(cf);
 
 -         t.setKeySerializer(StringRedisSerializer.UTF_8);
 
 -         t.setHashKeySerializer(StringRedisSerializer.UTF_8);
 
 -         t.setValueSerializer(RedisSerializer.byteArray());
 
 -         t.setHashValueSerializer(RedisSerializer.byteArray());
 
 -         t.afterPropertiesSet();
 
 -         return t;
 
 -     }
 
 - }
 
  复制代码 application.yml 
- spring:
 
 -   redis:
 
 -     host: 127.0.0.1
 
 -     port: 6379
 
 -     # password: yourpwd
 
 - app:
 
 -   redis:
 
 -     json-database: 0      # 对象模板使用的 DB
 
 -     binary-database: 1    # 二进制模板使用的 DB
 
  复制代码 使用 
- @Autowired private RedisTemplate<String, Object> redisTemplate;               // 走 DB0
 
 - @Autowired @Qualifier("binaryRedisTemplate") private RedisTemplate<String, byte[]> binTpl; // 走 DB1
 
  复制代码注意 - 以上仅适用于单机/主从模式。Redis Cluster 不支持多 DB,固定为 0,需要用 key 前缀区分。
 
 
  
  
 
结论 - 需要两个不同 DB(例如字符串用 DB0、二进制用 DB1)时,必须自己声明两个 RedisConnectionFactory。因为 Spring Boot 的默认工厂是按 ConditionalOnMissingBean(RedisConnectionFactory) 创建的,只要你自己声明了任意一个 RedisConnectionFactory,默认工厂就不会再被创建,所以不能“一半用默认一半自定义”。
 
 
 如何选择 - 只用同一个 DB:不要声明任何 ConnectionFactory,直接用 Boot 的默认 factory,给出两个不同的 RedisTemplate 即可(它们共用一个 DB)。
 - 用两个不同 DB:手动声明两个 ConnectionFactory(jsonConnectionFactory、binaryConnectionFactory),分别配置 database 索引,然后各自绑定到对应的 RedisTemplate;可用 @Primary 或 @Qualifier 解决注入歧义。
 
 
 示例A:同一 DB(共用默认工厂)  
- @Configuration
 
 - public class RedisTemplatesSameDbConfig {
 
  
-   @Bean
 
 -   public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory cf) { /* JSON 配置 */ }
 
  
-   @Bean(name = "binaryRedisTemplate")
 
 -   public RedisTemplate<String, byte[]> binaryRedisTemplate(RedisConnectionFactory cf) {
 
 -     RedisTemplate<String, byte[]> t = new RedisTemplate<>();
 
 -     t.setConnectionFactory(cf); // 使用默认 factory -> 同一 DB
 
 -     t.setKeySerializer(StringRedisSerializer.UTF_8);
 
 -     t.setValueSerializer(RedisSerializer.byteArray());
 
 -     t.afterPropertiesSet();
 
 -     return t;
 
 -   }
 
 - }
 
  复制代码 示例B:两个不同 DB(必须同时自定义两个 factory) 
- @Configuration
 
 - public class RedisMultiDbConfig {
 
  
-   @Primary
 
 -   @Bean("jsonConnectionFactory")
 
 -   public LettuceConnectionFactory jsonCF(RedisProperties props,
 
 -       @Value("${app.redis.json-database:0}") int db) { /* host/port/pwd + cfg.setDatabase(db) */ }
 
  
-   @Bean("binaryConnectionFactory")
 
 -   public LettuceConnectionFactory binCF(RedisProperties props,
 
 -       @Value("${app.redis.binary-database:1}") int db) { /* 同上,db 不同 */ }
 
  
-   @Primary
 
 -   @Bean
 
 -   public RedisTemplate<String, Object> redisTemplate(
 
 -       @Qualifier("jsonConnectionFactory") RedisConnectionFactory cf) { /* JSON 模板 */ }
 
  
-   @Bean("binaryRedisTemplate")
 
 -   public RedisTemplate<String, byte[]> binaryRedisTemplate(
 
 -       @Qualifier("binaryConnectionFactory") RedisConnectionFactory cf) { /* 二进制模板 */ }
 
 - }
 
  复制代码提示 - Redis Cluster 不支持多 DB,固定为 0;如是集群只能用 key 前缀区分,无法用不同 DB。
 
 
  |   
 
 
 
 |