項目不同業務的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