在编码过程中经常会遇到需要配置多个redis数据源,或者在同一数据源下切换database的场景。
今天遇到了需要动态切换database的业务需求,找了几个方法,虽然能切换,但是存在线程安全问题。最终我选择了配置多数据源来切换database。也就是重新生成一个 redisTemplate,通过修改JedisConnectionFactory连接信息的方法。这种方法通用与MongoDB的多数据源配置,也是通过配置bean工厂实现。且是线程安全的。
1.配置文件如下
# redis配置
redis:
# Redis数据库索引
database: 0
# Redis服务器地址
host:
# Redis服务器连接端口
port:
# Redis服务器连接密码(默认为空)
password:
#redis数据源2
redis2:
database: 2
host:
port:
password:
2.redis配置类
@Configuration
public class Redis2Configs {
@Value("${spring.redis2.database}")
private int database;
@Value("${spring.redis2.host}")
private String host;
@Value("${spring.redis2.password}")
private String password;
@Value("${spring.redis2.port}")
private int port;
@Bean(name={"redisTemplate2"})//容器注入名称
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redis2ConnectionFactory());
redisTemplate.setKeySerializer(keySerializer());
redisTemplate.setHashKeySerializer(keySerializer());
redisTemplate.setValueSerializer(valueSerializer());
redisTemplate.setHashValueSerializer(valueSerializer());
return redisTemplate;
}
private RedisSerializer<String> keySerializer() {
return new StringRedisSerializer();
}
private RedisSerializer<Object> valueSerializer() {
return new GenericFastJsonRedisSerializer();
}
private JedisConnectionFactory redis2ConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setDatabase(database);
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
JedisClientConfiguration clientConfig = JedisClientConfiguration.builder()
.build();
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration,clientConfig);
jedisConnectionFactory.afterPropertiesSet();
return jedisConnectionFactory;
}
PS:为了简便我没有配置连接池,需要的可以添加配置信息
3.注入需要的数据源进行使用
@Autowired
private RedisTemplate redisTemplate;//默认配置
@Resource(name = "redisTemplate2")
private RedisTemplate redisTemplate2;
Boolean hasKey = redisTemplate2.hasKey("key");
Set keys = redisTemplate.opsForHash().keys("key");
参考
SpringBoot配置Redis多数据源,或同一数据源切换database_redis切换database_保利万的博客-CSDN博客
Spring Boot实现Redis多数据源动态切换 | Spring Cloud 32_redis动态切换数据源_gmHappy的博客-CSDN博客