gpt4 book ai didi

c# - 如何进行延续并将其作为 MULTI 命令的一部分包含在内?

转载 作者:IT王子 更新时间:2023-10-29 06:11:39 24 4
gpt4 key购买 nike

总而言之,我正在尝试调用 ITransaction.SetPopAsync(...) 并执行其他写入操作作为底层 MULTI Redis 原子操作的一部分。

我尝试执行 SetPopAsync(...) 调用 Task.ContinueWith 的延续,并在回调中执行所谓的其他写入操作,但是当我发现这些是在底层 MULTI 操作结束后(即 ITransaction.ExecuteAsync() 完成时)执行时,我感到很惊讶。

也许我错了,但我觉得只有将 LUA 脚本加载到 Redis 并从 C# 调用它才能完成此原子操作。

对于我的案例,是否有任何其他解决方案可以完全在 C# 和 StackExchange.Redis 库中实现?

更多信息...

我发现有关于此主题的特定文档 here .

现在我更困惑了,因为 *如果你执行整个 spop 而它不是 MULTI 命令的一部分,并且当你创建其他键时会发生什么在 spop 之后,系统出现故障并导致数据损坏?

所以...我是否遗漏了一些可以让我执行整个 spop 并确保所有其他操作都将完成并持久化的东西?

示例场景...

正如@BerinLoritsch 在这里的一些评论中所要求的,我将在这里抛出一个使用 Redis 命令的伪代码来举例说明这里发生了什么:

MULTI
key1MemberValue = spop key1 1

sadd key2 key1MemberValue
zadd key3 1 key1MemberValue
EXEC

请注意,我无法使用 smove,因为在我的真实案例中我不知道集合成员。我需要随机弹出一个。

最佳答案

最终,您需要了解 redis multi/exec block 不像 ADO.NET 事务。从根本上说,以下(来自问题)在 redis 中是不可能的:

MULTI
key1MemberValue = spop key1 1

sadd key2 key1MemberValue
zadd key3 1 key1MemberValue
EXEC

因为你从spop得到的是:QUEUED .就这样。在 EXEC 之前,您不会得到任何答案 , 所以你不能sadd 中使用这个值/zaddMULTI里面.

可以想象,在原始 Redis 中,您可以做的是涉及 WATCH 的事情;然而,这一切意味着如果 WATCH -ed 键被另一个连接突变,MULTI/EXEC block 被放弃,未执行;你仍然spop -ped.

所以从根本上说:是的,如果您希望在没有竞争连接使状态无效的情况下发生这种情况:您将必须通过 Lua 和 EVAL 来完成/EVALSHA - 或者它需要更改 Condition API。

关于c# - 如何进行延续并将其作为 MULTI 命令的一部分包含在内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28764856/

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