Skip to content

通过 RedisTemplate 单次访问获取多个缓存值

🏷️ Spring Boot Redis

使用 redisTemplate 尝试通过单次访问 Redis 获取多个数据时,使用了 multiexec 方法。但在运行时报了如下错误:

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);
}

  1. 记一次 Redis 不定时命中率降低问题调查 ↩︎