Springboot配置多个redis源

本文介绍在项目中如何配置并使用两个Redis数据源,包括配置文件设置、创建配置类及服务类的方法,实现对两个不同Redis实例的连接与操作。
- 场景:项目中需要用到连接两个redis数据源
  • 实现:

    • 首先在配置文件中配置数据源信息:

      #redis
      spring.redis.database=88
      spring.redis.host=XXXX
      spring.redis.port=6379
      spring.redis.password=XXXX
      
      #redis2
      spring.redis.database.ad=0
      spring.redis.host.ad=XXXX
      spring.redis.port.ad=6379
      spring.redis.password.ad=XXXX
      
      spring.redis.jedis.pool.max-active=64
      spring.redis.jedis.pool.max-wait=1000
      spring.redis.jedis.pool.max-idle=8
      spring.redis.jedis.pool.min-idle=1
      spring.redis.timeout=5000
      
    • 增加redis配置类:

     @Configuration
     public class RedisConfigAd {
         /**
          * Logger
          */
         private static final Logger lg = LoggerFactory.getLogger(RedisConfigAd.class);
         
     @Value("${spring.redis.host.ad}")
     public String host;
     @Value("${spring.redis.port.ad}")
     public int port;
     @Value("${spring.redis.password.ad}")
     public String password;
     @Value("${spring.redis.database.ad}")
     public int database;
     @Value("${spring.redis.jedis.pool.max-idle}")
     public int maxIdle;
     @Value("${spring.redis.jedis.pool.min-idle}")
     public int minIdle;
     @Value("${spring.redis.jedis.pool.max-active}")
     public int maxActive;
     @Value("${spring.redis.jedis.pool.max-wait}")
     public String maxWait;
     @Value("${spring.redis.timeout}")
     public String timeout;
     
     public JedisConnectionFactory jedisConnectionFactoryAd () {
         RedisStandaloneConfiguration rf = new RedisStandaloneConfiguration();
         rf.setDatabase(database);
         rf.setHostName(host);
         rf.setPort(port);
         rf.setPassword(password);
         int to = Integer.parseInt(timeout);
         JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpb =
                 (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();
         JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
         jedisPoolConfig.setMaxIdle(maxIdle);
         jedisPoolConfig.setMinIdle(minIdle);
         jedisPoolConfig.setMaxTotal(maxActive);
         int l = Integer.parseInt(maxWait);
         jedisPoolConfig.setMaxWaitMillis(l);
         jpb.poolConfig(jedisPoolConfig);
         JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(rf, jpb.build());
         return jedisConnectionFactory;
     }
    
```
@Bean(name = "redisTemplate1")
public RedisTemplate<String, Object> redisTemplate1( ) {
    // 配置redisTemplate
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
    redisTemplate.setConnectionFactory(jedisConnectionFactoryAd());
   //  StringRedisSerializer stringSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(keySerializer()); // key序列化
    redisTemplate.setValueSerializer(valueSerializer()); // value序列化
    redisTemplate.setHashKeySerializer(keySerializer()); // Hash key序列化
    redisTemplate.setHashValueSerializer(valueSerializer()); // Hash value序列化
    redisTemplate.setDefaultSerializer(valueSerializer());
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

private RedisSerializer<String> keySerializer() {
    return new StringRedisSerializer();
}

private RedisSerializer<Object> valueSerializer() {
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    return jackson2JsonRedisSerializer;
}
}
```
  • 增加对RedisTemplate1的封装:

    @Service
    public class RedisServiceAd {    
        @Autowired    
        @Resource(name = "redisTemplate1")    
        private RedisTemplate<String,Object> redisTemplate1;   
        
        public boolean expire(String key,long time){        
            try {            
                if(time>0){                
                    redisTemplate1.expire(key, time, TimeUnit.SECONDS);            
                }            
                return true;        
            } catch (Exception e) {            
                e.printStackTrace();           
                return false;        
            }    
        }
        ......
    
  • 注意事项

    • 对于配置类中的RedisTemplate,需要加@Bean(name = “redisTemplate1”)指定名称;

      同时,在注入RedisTemplate ,需要@Resource指定注入哪一个,如:

      ​ @Autowired
      ​ @Resource(name = “redisTemplate1”)
      ​ private RedisTemplate<String,Object> redisTemplate1;

    • JedisConnectionFactory是单例的,所以只能有一个JedisConnectionFactory的bean实例,否则编译会报错。

<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`保证数据可读性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值