gpt4 book ai didi

c# - Redis C# - 在事务中使用 Incr 值

转载 作者:行者123 更新时间:2023-12-03 06:42:12 26 4
gpt4 key购买 nike

我正在尝试使用 Redis INCR 和使用 StackExchange.Redis 的 C# 中用作哈希字段的递增值。
question点与我需要的相似,但在 Node.js 中。
下面是我需要的东西。

            ITransaction transation = m_connection.GetDatabase()
.CreateTransaction();
Task<long> incrementTask = transation.StringIncrementAsync(sequenceNumberRedisKey);


if (await transation.ExecuteAsync())
{
long sequenceNumber = await incrementTask;
await transation.HashSetAsync(responseRedisKey, sequenceNumber, response);
}
请注意 sequenceNumber是我打算在事务中执行的第一个操作的结果。
该代码似乎在我什至执行任何操作之前就执行并提交了事务。
  • 这是在一个事务中进行多项操作的方式吗?
  • 这是我可以在操作 2 (HashSetAsync) 中使用操作 1 (StringIncrementAsync) 的结果的方式吗?
  • 如果 HashSetAsync 返回 false,如何回滚序列号增量?
  • 为什么没有明确的提交?
  • 最佳答案

    redis MULTI/EXEC 单元有一个基本特性,这意味着您无法在操作过程中获得结果。因此,有两种常见的方法可以满足您的要求:

  • 使用 Lua ( ScriptEvaluate[Async] ); Lua 脚本在服务器上自始至终执行,效率高,并且避免了与往返时间(延迟或带宽)或来自其他连接的竞争相关的所有问题
  • 使用读取当前值的乐观循环,然后在 SE-Redis 中创建一个添加 的事务。约束 就是刚才读到的值是一样的,在事务内部执行副作用;库将协调必要的 WATCH 等机制以使其健壮,但如果约束条件无效(即库返回 false ),您需要从
  • 开始重做所有事情。

    坦率地说,这些天我总是引导人们选择选项 1;如果服务器端 Lua 脚本不可用,选项 2 只是“吸引人的”(我用这个词很不正确)。
    我不在电脑前,但我猜脚本看起来像:
    local id = redis.call("incr", KEYS[1])
    redis.call("hset", KEYS[2], tostring(id), ARGV[1])
    return id

    关于c# - Redis C# - 在事务中使用 Incr 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63945465/

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