ycyw

项目不同业务的redis数据存在不同的库中,操作数据需要切换redis库,在网上找了一段代码,确实可以切换数据库。但是使用一段时间后发现部分数据存储的数据库不正确,排查后发现setDatabase是线程不安全的,并发下会有问题,可能导致数据在不同数据库中混淆。

代码如下:

/**
 * 切换redis数据库
 * @param index 数据库
 */
public void selectDB(int index){
    LettuceConnectionFactory lettuceConnectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();
    lettuceConnectionFactory.setDatabase(index);
    redisTemplate.setConnectionFactory(lettuceConnectionFactory);
    lettuceConnectionFactory.resetConnection();
}

解决方案:
1、加锁
2、配置实现多个RedisTemplate实例,每个实例负责访问一个数据库,这样也不需要切换数据库了
3、把所有数据都存在一个数据库,使用前缀区分不同的业务key

分类:

技术点:

相关文章: