【发布时间】:2019-02-19 17:03:20
【问题描述】:
我正在尝试使用 StackExchange.Redis 来实现事务添加或更新逻辑。我查看了 GitHub 上的 https://stackexchange.github.io/StackExchange.Redis/Transactions.html 示例,但这指的是“如果不存在则添加”过程,这实际上只是故事的一部分。
我的要求是“如果缓存项不存在则添加,如果没有更改则更新”(即乐观并发)。这个例子对https://github.com/StackExchange/StackExchange.Redis/issues/885 有帮助,但它只使用一个条件,就像 Github 上的交易示例一样。
我对 redis 事务的测试表明您不能添加多个条件,因此这种方法似乎有效:
var committed = await _redisDatabase.StringSetAsync(key, value, expiry, When.NotExists, flags);
if (committed)
{
return committed;
}
var txn = _redisDatabase.CreateTransaction();
txn.AddCondition(Condition.StringEqual(key, value));
txn.StringSetAsync(key, value, expiry, when, flags);
committed = await txn.ExecuteAsync();
return committed;
即假设它不存在,如果存在则尝试更新...总是需要调用When.NotExists,因为第二部分可能会失败,因为对象已更改或它不存在..所以您需要第一次调用你知道第二个由于过时而失败。
这会在第一次调用时生成一个 SETNX,然后是附加的 WATCH、GET、MULTI 和 SET 命令....是否可以将其组合到一个 Redis 事务中?
【问题讨论】: