【问题标题】:.NET StackExchangeRedis and order of execution with Batch not guaranteed?.NET StackExchangeRedis 和批处理的执行顺序不能保证?
【发布时间】:2018-01-11 00:58:59
【问题描述】:

我正在查看以下代码:

  • 向 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

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

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

【问题讨论】:

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


【解决方案1】:

顺序有保证,操作不会并行。

转述其中一位作者 (@Mark-Gravell):

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

更新

@mjwills 已经提到了SO answerthis unit test 也这么认为。您也可以在RedisBridge.cs 代码上验证这一点。即使在集群中,由于您向同一个键发出两个命令,它们都将转到同一个节点,并且它们在内部被推入/拉出Queue

【讨论】:

  • 请参考原始报价/文档? (不是拖钓,只是真诚地好奇,等等)。
  • 刚刚更新了答案。不幸的是,没有关于 SE.Redis 的好的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2017-08-08
  • 2016-05-02
  • 1970-01-01
相关资源
最近更新 更多