SpringBoot动态切换Redis库
SpringBoot动态切换Redis库,适用于SpringBoot 1.X 版本
·
背景说明
项目中已经使用了默认的库(db0), 但是有一个功能需要使用另一个库来存储数据。我这里所说的库都是针对同一个Redis中的。
方法一(简单粗暴型)
首先想到的就是直接切换数据库。代码如下:
// stringRedisTemplate 可以获取连接,直接更改连接的数据库
JedisConnectionFactory jedisConnectionFactory =(JedisConnectionFactory) stringRedisTemplate.getConnectionFactory();
jedisConnectionFactory.setDatabase(8);
stringRedisTemplate.setConnectionFactory(jedisConnectionFactory);
// 执行set 操作
ValueOperations valueOperations =stringRedisTemplate.opsForValue();
valueOperations.set("defaultDB", "this is the default dbinfo");
这种方式确实可以切换数据库, 但是存在的一个致命问题是: 如果你不再切换回去的话, 后面的操作就都是操作的这个数据库, 这显然不是我想要的效果。 PASS。
方法二(重新获取RedisTemplate)
对每一个你要操作的库, 配置一个对应的 RedisTemplate, 这样需要哪个就用哪个。
Redis配置。 代码如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class RedisConfigWWj {
@Value("${spring.redis.host}")
private String hostName;
@Value("${spring.redis.password}")
private String passWord;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.pool.max-active}")
private int maxActive;
// 你需要的数据库
private int dbIndex = 8;
public RedisConnectionFactory getRedisConnectionFactory(String hostName, int port, int database, int maxActive) { // 是负责建立Factory的连接工厂类
JedisConnectionFactory jedisFactory = new JedisConnectionFactory();
jedisFactory.setHostName(hostName);
jedisFactory.setPort(port);
jedisFactory.setDatabase(database)
JedisPoolConfig poolConfig = new JedisPoolConfig(); // 进行连接池配置
poolConfig.setMaxTotal(maxActive);
// poolConfig.setMaxIdle(8);// 这些配置需要就加
// poolConfig.setMinIdle(2);
// poolConfig.setMaxWaitMillis(100);
jedisFactory.setPoolConfig(poolConfig);
jedisFactory.afterPropertiesSet(); // 初始化连接池配置
return jedisFactory;
}
@Bean("redisDb8")
public RedisTemplate<String, Object> getDb8RedisTemplate() {
// 建立Redis的连接
RedisConnectionFactory factory = this.getRedisConnectionFactory(hostName, port, dbIndex, maxActive);
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型
redisTemplate.setValueSerializer(new StringRedisSerializer()); // value的序列化类型
return redisTemplate;
}
}
如何使用:
1.在你的类中注入需要的 RedisTemplate
@Resource(name = "redisTwo")
private RedisTemplate redisTemplateTDb8;
2.执行对应的操作即可:
redisTemplateTwo.opsForValue().set("test-other-db", "this value should in db8");
这种方式适用于 springboot 是1.X 的版本。
方法三
我在查找资料的时候最早是找到这个列子, 上关键部分代码:
public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig, int db) {
// 单机版jedis
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
// 设置redis服务器的host或者ip地址
redisStandaloneConfiguration.setHostName("127.55.41.247");
// 设置默认使用的数据库
redisStandaloneConfiguration.setDatabase(db);
// 设置密码
// redisStandaloneConfiguration.setPassword("123456");
// 设置redis的服务的端口号
redisStandaloneConfiguration.setPort(6739);
// 获得默认的连接池构造器
JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration
.builder();
// 指定jedisPoolConifig来修改默认的连接池构造器(真麻烦,滥用设计模式!)
jpcb.poolConfig(jedisPoolConfig);
// 通过构造器来构造jedis客户端配置
JedisClientConfiguration jedisClientConfiguration = jpcb.build();
// 单机配置 + 客户端配置 = jedis连接工厂
return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
}
这个例子中RedisStandaloneConfiguration 需要使用的 sping-data-redis.jar 版本需要2.0以上中才有会这个类。 但是jar升级到2.0后,项目直接启动不了, 因为我们的springboot版本是1.5X。
--结束
好记性不如烂笔头。
更多推荐
已为社区贡献1条内容
所有评论(0)