【NoSql】Springboot配置多Redis源

Springboot配置多Redis源

一、背景

因项目部署了新集群,某些缓存数据需要在旧的redis上取,就必须配置多个数据源动态获取相对应的源以兼容业务。

二、配置依赖

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

⚠️注:commons-pool2依赖是为了使lettuce连接池生效,在springboot2后,redis默认使用lettuce连接池;而springboot2前则使用jredis的pool。

三、redis-yaml配置项

spring:
  redis:
    database: 19
    host: 
    port: 6379
    password: 
    timeout: 10000
    common:
      lettuce:
        pool:
          max-active: 3000 # 连接池最大连接数(使用负值表示没有限制)
          max-idle: 30 # 连接池中的最大空闲连接
          max-wait: 3000 # 连接池最大阻塞等待时间(使用负值表示没有限制)
          min-idle: 10 # 连接池中的最小空闲连接
  jr-live:
    database: 0
    host: 
    port: 
    password: 
    timeout: 10000

Ps:common配置项可以抽取出来,目前因时间问题不作处理。

四、redis配置类

首先需要初始化对应数据源的lettuceConnection工厂

/**
     * 原redis Factory
     * @param hostName
     * @param port
     * @param index
     * @return
     * @author simon
     */
@Bean(name = "RedisConnectionFactoryJrLive")
public LettuceConnectionFactory connectionFactoryJrLive(
    @Value("${spring.jr-live.host}") String hostName,
    @Value("${spring.jr-live.port}") int port,
    @Value("${spring.jr-live.password}") String password,
    @Value("${spring.jr-live.database}") int index) {

    RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
    redisStandaloneConfiguration.setDatabase(index);
    redisStandaloneConfiguration.setHostName(hostName);
    redisStandaloneConfiguration.setPort(port);
    redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
    LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
        .commandTimeout(Duration.ofMillis(jrLiveTimeOut))
        .poolConfig(genericObjectPoolConfig())
        .build();
    LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration, clientConfig);
    lettuceConnectionFactory.setShareNativeConnection(false);
    return lettuceConnectionFactory;
}

// 连接池配置
@Bean
public GenericObjectPoolConfig genericObjectPoolConfig() {
    GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
    genericObjectPoolConfig.setMaxIdle(maxIdle);
    genericObjectPoolConfig.setMinIdle(minIdle);
    genericObjectPoolConfig.setMaxTotal(maxTotal);
    genericObjectPoolConfig.setMaxWaitMillis(maxWaitMillis);
    return genericObjectPoolConfig;
}

配置redisTemplate实例

 /**
     * 龙直播redis
     * @param factory
     * @return
 */
@Bean(name = "redisTemplate")
@Primary
public RedisTemplate<String, Object> redisTemplate(@Qualifier("RedisConnectionFactory")
                                                   LettuceConnectionFactory factory){
    //        factory.setShareNativeConnection(false);
    //        factory.setValidateConnection(true);

    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(factory);
    /* 使用Jackson2JsonRedisSerialize 替换默认序列化(默认采用的是JDK序列化)
         *  key采用StringRedisSerializer, value采用Jackson2JsonRedisSerializer
         *  */
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    Jackson2JsonRedisSerializer<Object> 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);

    redisTemplate.setKeySerializer(stringRedisSerializer);//key序列化
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);  //value序列化
    redisTemplate.setHashKeySerializer(stringRedisSerializer);
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

注:多数据源时尽量使用@Resorce(name = "beanName"),当然也可以使用@Qualifier注解。

附:

比较好用的多redis数据源util

@Component
public class RedisUtil {

    private static RedisTemplate RedisWhDatabase;
    private static StringRedisTemplate stringRedisTemplateWh;

    private static RedisTemplate RedisEsDatabase;
    private static StringRedisTemplate stringRedisTemplateEs;

    @Autowired
    public RedisUtil(@Qualifier("RedisWhDatabase") RedisTemplate RedisWhDatabase,
                     @Qualifier("StringRedisTemplateWh") StringRedisTemplate stringRedisTemplateWh,
                     @Qualifier("RedisEsDatabase") RedisTemplate RedisEsDatabase,
                     @Qualifier("StringRedisTemplateEs") StringRedisTemplate stringRedisTemplateEs) {
        RedisUtil.RedisWhDatabase = RedisWhDatabase;
        RedisUtil.stringRedisTemplateWh = stringRedisTemplateWh;
        RedisUtil.RedisEsDatabase = RedisEsDatabase;
        RedisUtil.stringRedisTemplateEs = stringRedisTemplateEs;
    }

    public static void set(String key, String value, Long time) throws IOException {

    }

    public static String get(String key) {

    }
}
posted @ 2022-12-06 14:57  simonlee_java  阅读(1571)  评论(0)    收藏  举报