gpt4 book ai didi

java - 如何在 Spring Data Redis Reactive 中使用事务?

转载 作者:IT王子 更新时间:2023-10-29 06:09:21 28 4
gpt4 key购买 nike

我正在尝试使用 spring-data-redis 2.1.8 中的 ReactiveRedisOperations 来执行事务,例如:

WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

但在浏览 docs 时,我似乎无法找到执行此操作的方法或 ReactiveRedisOperations。这在响应式(Reactive)客户端中不可用,还是如何实现?

最佳答案

TL;DR:没有对使用 Reactive API 的 Redis 事务的适当支持

原因在于执行模型:Redis 如何执行事务以及响应式(Reactive) API 应该如何工作。

使用事务时,连接进入事务状态,然后命令排队并最终执行 EXEC .使用 exec 执行排队的命令会使单个命令的执行以 EXEC 为条件。命令。

考虑以下代码片段(Lettuce 代码):

RedisReactiveCommands<String, String> commands = …;

commands.multi().then(commands.set("key", "value")).then(commands.exec());

此序列以某种线性方式显示命令调用:

  • 问题 MULTI
  • 一次MULTI完成,发出一个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 Data Redis 中没有用于事务用途的 API。

关于java - 如何在 Spring Data Redis Reactive 中使用事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56647972/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com