例如,我试图使用SpringDataRedis2.1.8中的ReactiveRedisOperations进行事务处理:
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC但是,在浏览文档或ReactiveRedisOperations时,我似乎找不到这样的方法。这是否在反应性客户端中不可用,或者如何实现?
发布于 2019-06-18 11:37:09
TL;DR:使用反应性API对Redis事务没有适当的支持
原因在于执行模型: Redis是如何执行事务的,以及反应性API应该如何工作。
当使用事务时,连接进入事务状态,然后命令排队,最后使用EXEC执行。使用exec执行排队命令使单个命令的执行取决于EXEC命令。
考虑以下片段(生菜代码):
RedisReactiveCommands<String, String> commands = …;
commands.multi().then(commands.set("key", "value")).then(commands.exec());这个序列以某种线性的方式显示命令调用:
MULTIMULTI完成,发出一个SET命令SET完成,调用EXEC警告与SET:SET只在调用EXEC之后才完成。这意味着我们有一个对exec命令的前向引用。我们不能听将来将要执行的命令。
您可以应用一种解决方法:
RedisReactiveCommands<String, String> commands = …
Mono<TransactionResult> tx = commands.multi()
.flatMap(ignore -> {
commands.set("key", "value").doOnNext(…).subscribe();
return commands.exec();
});解决方法将在代码中包含命令订阅(注意:这是反应性编程中的反模式)。调用exec()之后,您将得到TransactionResult作为回报。
还请注意:虽然您可以通过Mono<TransactionResult>检索结果,但实际的SET命令也会发出其结果(参见doOnNext(…))。
尽管如此,它允许我们回过头来讨论实际问题:因为这些概念不能很好地结合在一起,所以在Spring中没有用于事务性使用的API。
https://stackoverflow.com/questions/56647972
复制相似问题