2017-08-03 13 views
1

我檢討下面的代碼正試圖:.NET StackExchangeRedis和批次執行順序不能保證?

  • 的鍵/值添加到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 < - 密鑰不存在。鍵被創建。然後成員加入密鑰。

我希望也不希望訂單得到保證,意思是說,它試圖儘可能快地平行化。

所以 - 我的理解是否正確或錯位?

+0

https://stackoverflow.com/a/30083293/34092有幫助嗎? – mjwills

回答

1

訂單得到保證,並且操作不會並行發生。

複述作者之一(@馬克 - Gravell):

一批做什麼是推遲一組操作的,並確保他們彼此相鄰就被送進連續單個連接,所以沒有其他線程該多路複用器將在中間獲得命令。

更新

@mjwills已經提到的SO answer。另外this unit test假設如此。您也可以驗證RedisBridge.cs的代碼。即使在集羣中,由於您將兩個命令發佈到同一個密鑰,因此兩者都將轉到同一個節點,並在內部將其從Queue中推入/拉出。

+0

請參考原始報價/文檔? (不是拖延,只是誠實好奇等)。 –

+0

剛剛更新了答案。遺憾的是SE.Redis沒有很好的文檔。 – thepirat000