1. 程式人生 > 其它 >Springboot配置多Redis源

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) {

    }
}