通过 RedisTemplate 单次访问获取多个缓存值
🏷️ Spring Boot Redis
使用 redisTemplate 尝试通过单次访问 Redis 获取多个数据时,使用了 multi 和 exec 方法。但在运行时报了如下错误:
io.lettuce.core.RedisCommandExecutionException: ERR EXEC without MULTI
代码如下:
java
redisTemplate.multi();
for (String key : keys) {
hmget(key);
}
List<Object> result = redisTemplate.exec();
return result;
根据 StackOverflow 上的回答,需要调用 redisTemplate.setEnableTransactionSupport(true)
方法来开启事务。
修改后代码如下:
java
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.multi();
for (String key : keys) {
hmget(key);
}
List<Object> result = redisTemplate.exec();
redisTemplate.setEnableTransactionSupport(false);
return result;
2023/05/07 追记
DANGER
上面的写法不够完善,有可能会引起其他问题。[1]
新的参考写法如下:
java
try {
stringRedisTemplate.setEnableTransactionSupport(true);
stringRedisTemplate.multi();
// do some redis operations
stringRedisTemplate.exec();
} catch (Exception ex) {
stringRedisTemplate.discard();
} finally {
stringRedisTemplate.setEnableTransactionSupport(false);
}