使用 Jedis 时如何检测 watch/exec 失败?

How to detect watch/exec failure when using Jedis?

这是我尝试执行的操作顺序:

WATCH somekey
MULTI
...
SET somekey somevalue
EXEC

我通过 RedisTemplateexecute(SessionCallback) 方法(伪代码)执行此操作:

l = template.execute({
  ops.watch("somekey");
  ops.multi()
  ops.opsForValue().set("somekey", "somevalue")
  return ops.exec()
})

我的问题是,当使用 jedis 时,l 不是 null 而是一个空列表,因此执行失败与执行成功无法区分,因为 multi 中没有操作 return 结果。

这里的单元测试似乎证实了这一点:https://github.com/spring-projects/spring-data-redis/blob/1.8.4.RELEASE/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java#L740 测试失败的地方:

if (redisTemplate.getConnectionFactory() instanceof JedisConnectionFactory) {
    assertThat(results, is(empty()));
} else {
    assertNull(results);
}

与它下面的 testUnwatch 测试相比,测试 成功 取消监视后执行,并且还期望一个空列表 (results.isEmpty())。

使用Jedis时如何区分这两种情况?

TL;DR

您无法使用 Jedis 检测事务回滚。

说明

Jedis returns,在any case,当前可用版本(2.8.2、2.9.0)中的一个List对象。此更改是代码清理的一部分,以防止 Jedis 在回滚 Redis 事务时在 exec(…) 上返回 null

现在,Jedis rolled back the change 但是 Jedis 已经有大约一年没有发布了。

如果检测事务回滚对您的要求至关重要,请尝试 different Redis client