.NET StackExchangeRedis和Batch的执行顺序无法保证?

时间:2017-08-03 12:14:54

标签: c# .net redis async-await stackexchange.redis

我正在审核以下代码:

  • 将一个键/值添加到Redis数据库。
  • 在新的redis密钥上设置到期日期。

{
    var batch = database.CreateBatch();

    var tasks = new Task[]
    {
        batch.SetAddAsync(key, value, flags),
        batch.KeyExpireAsync(key, expiry, flags)
    };

    batch.Execute();

    await Task.WhenAll(tasks)
}

只需一次redis Batch即可完成此操作。

我的印象是,在批量处理时,你不能假设顺序,更不用说async/await中的多个任务了。

因此,可能会发生以下顺序:

  • KeyExpiresAsync< - 键尚不存在。
  • SetAddAsync< - 键不存在。密钥已创建。然后成员加入了密钥。

我希望并且不希望订单得到保证,这意味着......它尽可能快地将其并行。

那么 - 我的理解是正确的还是错位的?

1 个答案:

答案 0 :(得分:1)

订单得到保证,操作不会并行发生。

解释其中一位作者(@ Mark-Gravell):

批处理的作用是推迟一组操作并确保它们彼此相邻地连续发送到单个连接,因此该多路复用器上的其他线程不会在中间获取命令。

更新

@mwwills已经提到SO answer。同样this unit test也是如此。您也可以在RedisBridge.cs代码上验证该问题。即使在群集中,由于您要将两个命令发布到同一个密钥,因此两个命令都将转到同一个节点,并且它们在内部被推送到/ Queue