【问题标题】:How to detect watch/exec failure when using Jedis?使用 Jedis 时如何检测 watch/exec 失败?
【发布时间】:2017-06-16 03:24:15
【问题描述】:

这是我正在尝试执行的操作序列:

WATCH somekey
MULTI
...
SET somekey somevalue
EXEC

我通过RedisTemplate(伪代码)的execute(SessionCallback) 方法做到这一点:

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

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

这里的单元测试似乎证实了这一点: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 测试相比,该测试在 unwatch 之后测试 successful exec 并且还期望一个空列表 (results.isEmpty())。

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

【问题讨论】:

    标签: spring jedis spring-data-redis


    【解决方案1】:

    TL;DR

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

    说明

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

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

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

    【讨论】:

    • 感谢您的建议。令人担忧的是,做出这样的改变只是为了取悦一些 linter!
    • > 使用 Jedis 无法检测到事务回滚。
    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 2011-11-05
    • 2021-06-29
    • 2016-02-07
    • 2011-09-13
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多