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

浙公网安备 33010602011771号