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

Redis C# - Using Incr value in a transaction

我正在尝试使用 Redis INCR 和增量值作为 C# 使用 StackExchange.Redis 的哈希中的字段。 这个点和我需要的类似,但是在Node.

下面是我需要的东西。

            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是我打算在交易中做的第一个操作的结果

代码似乎在我执行任何操作之前事务就已执行并提交。

  1. 这是一次交易多次操作的方式吗?
  2. 这是我可以在操作 2 (HashSetAsync) 中使用操作 1 (StringIncrementAsync) 的结果的方式吗?
  3. 如果 HashSetAsync returns false,我如何回滚序列号增量?
  4. 为什么没有明确的提交?

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

  1. 使用Lua (ScriptEvaluate[Async]); Lua 脚本在服务器 start-to-end 上执行,效率高,并且避免了与 round-trip 时间(延迟或带宽)相关的所有问题或来自其他连接的竞争
  2. 使用读取当前值的乐观循环,然后在SE-Redis中创建一个事务,添加一个约束,即您刚刚读取的值是相同的,并且在交易中执行side-effects;该库将 co-ordinate 必要的 WATCH 等机制来使其健壮,但是如果约束条件被证明是无效的(即库 returns false),您需要重做一切开始

坦率地说,这些天我总是引导人们选择选项 1;如果 server-side Lua 脚本不可用,选项 2 只是“有吸引力的”(我用这个词很不正确)。

我不在 PC 上,但我猜脚本看起来像这样:

local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id