问题场景:
最近的项目需要同时操作一个redis中多个数据库,然后发现redisTemplate中并没有提供什么切换数据库的方法
这引起了我的思考
原因分析:
我们使用springboot redisTemplate最常规的做法就是在配置文件中配置redis的url,
然后springboot自动注入配置自动生成redisTemplate这个bean
但这里也没有提及redis0到15号数据库的选择
代码分析
RedisTemplate继承RedisAccessor类
在RedisAccessor中有这样一个方法
public void setConnectionFactory(RedisConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
这个方法应该就是负责设置redis连接配置的
然后这个RedisConnectionFactory是个接口,不能直接生成实例
那么必定有产出RedisConnectionFactory实例的方法或者继承他的类
找到了他的子类LettuceConnectionFactory
里面有这个方法
public LettuceConnectionFactory(RedisStandaloneConfiguration configuration) {
this((RedisStandaloneConfiguration)configuration, new LettuceConnectionFactory.MutableLettuceClientConfiguration());
}
刚好我的redis是单机运作,就用它了
后面的就基本是简单new对象set属性就好了,不需要多说
我直接给出完整版配置供大家参考
解决方案:
@SpringBootConfiguration
public class RedisConfig {
//redis地址
@Value("${spring.redis.host}")
private String host;
//redis端口号
@Value("${spring.redis.port}")
private int port;
@Bean
RedisTemplate<String,Object> deliveryRedisTemplate(){
RedisStandaloneConfiguration server = new RedisStandaloneConfiguration();
server.setHostName(host); // 指定地址
server.setDatabase(0); // 指定数据库
server.setPort(port); //指定端口
LettuceConnectionFactory factory = new LettuceConnectionFactory(server);
factory.afterPropertiesSet(); //刷新配置
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
return redisTemplate;
}
..............需要则配置多个redisTemplate对象的bean即可
}