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
是我打算在交易中做的第一个操作的结果
代码似乎在我执行任何操作之前事务就已执行并提交。
- 这是一次交易多次操作的方式吗?
- 这是我可以在操作 2 (HashSetAsync) 中使用操作 1 (StringIncrementAsync) 的结果的方式吗?
- 如果 HashSetAsync returns false,我如何回滚序列号增量?
- 为什么没有明确的提交?
redis MULTI/EXEC 单元有一个基本特征,这意味着您在操作期间无法 获得结果。因此,有两种常见的方法可以满足您的要求:
- 使用Lua (
ScriptEvaluate[Async]
); Lua 脚本在服务器 start-to-end 上执行,效率高,并且避免了与 round-trip 时间(延迟或带宽)相关的所有问题或来自其他连接的竞争
- 使用读取当前值的乐观循环,然后在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
我正在尝试使用 Redis INCR 和增量值作为 C# 使用 StackExchange.Redis 的哈希中的字段。
这个
下面是我需要的东西。
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 returns false,我如何回滚序列号增量?
- 为什么没有明确的提交?
redis MULTI/EXEC 单元有一个基本特征,这意味着您在操作期间无法 获得结果。因此,有两种常见的方法可以满足您的要求:
- 使用Lua (
ScriptEvaluate[Async]
); Lua 脚本在服务器 start-to-end 上执行,效率高,并且避免了与 round-trip 时间(延迟或带宽)相关的所有问题或来自其他连接的竞争 - 使用读取当前值的乐观循环,然后在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