StackExchange.Redis 事务链接参数

StackExchange.Redis Transaction chaining parameters

我正在尝试执行包含两个操作的基本事务操作

  1. 获取集合的长度scard MySet
  2. 弹出给定长度的整个集合:spop MySet len

我知道可以连续使用 smembersdel。但我想要实现的是获取第一个操作的输出并在第二个操作中使用它并在事务中执行。到目前为止,这是我尝试过的:

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 运行时得到结果,这意味着它不可能使用那些结果 里面。你正在尝试的事情有点注定了。有两种方法可以在这里做你想做的事:

  1. 推测性地阅读您需要的内容,然后使用该知识作为约束执行multi/exec(事务)块,SE.Redis将在手表块;老实说,这真的很复杂,很难做到正确
  2. 使用Lua,意思是:ScriptEvaluate[Async],在这里你可以在服务器上连续执行的一系列操作中做你想做的一切,而不与其他连接竞争

选项 2 几乎总是正确的方法,因为它成为可能。