Springboot配置多Redis源
阿新 • • 發佈:2022-12-06
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) {
}
}