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



我正在尝试使用Redis INCR,并使用StackExchange.Redis将增量值用作C#哈希中的字段。这个问题与我需要的类似,但在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返回false,如何回滚序列号增量
  4. 为什么没有明确的承诺

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

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

坦率地说,这些天我总是引导人们选择选项1;选项2仅为"0";吸引人的";如果服务器端的Lua脚本不可用,(我使用这个术语非常错误(。

我不在电脑上,但我猜剧本看起来会像:

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

最新更新