【发布时间】: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