我正在尝试使用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
是我打算在事务中执行的第一个操作的结果。
代码看起来像是在我执行任何操作之前就执行并提交了事务。
- 这是在一个事务中执行多个操作的方法吗
- 这就是我在操作2(HashSetAsync(中使用操作1(StringIncrementAsync(的结果的方式吗
- 如果HashSetAsync返回false,如何回滚序列号增量
- 为什么没有明确的承诺
redis MULTI/EXEC单元有一个基本功能,这意味着您在操作过程中无法获得结果。因此,有两种常见的方法可以满足您的要求:
- 使用Lua(
ScriptEvaluate[Async]
(;Lua脚本在服务器上从头到尾执行,效率高,避免了与往返时间(延迟或带宽(或来自其他连接的竞争相关的所有问题 - 使用读取当前值的乐观循环,然后在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