如何解决StackExchange.Redis 事务链参数
我正在尝试执行包含两个操作的基本事务操作
- 获取集合的长度
scard MySet
- 用给定的长度弹出整个集合:
spop MySet len
我知道可以连续使用 smembers
和 del
。但是我想要实现的是获取第一个操作的输出并在第二个操作中使用它并在事务中执行它。这是我到目前为止尝试过的:
var transaction = this.cacheClient.Db1.Database.CreateTransaction();
var itemLength = transaction.SetLengthAsync(key).ContinueWith(async lengthTask =>
{
var length = await lengthTask;
try
{
// here I want to pass the length argument
return await transaction.SetPopAsync(key,length); // probably here transaction is already committed
// so it never passes this line and no exceptions thrown.
}
catch (Exception ex)
{
throw;
}
});
await transaction.ExecuteAsync();
此外,我对 CreateBatch
尝试了相同的操作并得到了相同的结果。我目前正在使用我上面提到的解决方法。我知道也可以评估 Lua 脚本,但我想知道交易是否可行,或者我做错了什么。
解决方法
redis 的本质是您不能在 multi/exec 期间读取数据 - 您只能在 exec 运行时获得结果,这意味着不可能在内部使用这些结果 多。你正在尝试的东西注定要失败。这里有两种方法可以做你想做的事:
- 推测性地阅读您需要的内容,然后使用该知识作为约束执行多/执行(事务)块,SE.Redis 将在 WATCH 块内强制执行;老实说,这真的很复杂,很难做到正确
- 使用Lua,意思是:ScriptEvaluate[Async],在这里你可以在服务器上连续执行的一系列操作中做你想做的一切,而不会与其他连接竞争
选项 2 几乎总是正确的方法,因为它成为可能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。