簡體   English   中英

StackExchange.Redis 事務

[英]StackExchange.Redis Transaction

如何在一個事務中運行兩個異步方法?

例如:

  var batchIds = new ConcurrentBag<int>();
  var trans = redis.CreateTransaction();

  var task = trans.ListRangeAsync(AllItems, 0L, batchSize - 1).ContinueWith(t =>
   {
    t?.Result.ToList().ForEach(x => batchIds.Add(JsonConvert.DeserializeObject<StockItemDto>(x).Id));
     }).ContinueWith(t=>{ trans.ListTrimAsync(AllItems, batchSize, -1); });  // This not work

  // This work but I'm not sure if taskRemove run exaclly after task
  var taskRemove = trans.ListTrimAsync(AllItems, batchSize, -1);                    
  trans.Execute(CommandFlags.FireAndForget);
  Task.WaitAll(task, taskRemove);

也許有人知道如何從列表中獲取一個范圍,然后在事務中刪除這個范圍?

你不能這樣做。

解決方案是為讀操作創建一個常規的IDatabase ,為寫操作創建一個ITransaction

為什么...? 因為StackExchange.Redis事務是 Redis 的MULTI / EXEC命令的抽象。 也就是說,事務是批量發送到 Redis 的命令隊列,它們的執行是原子的。 一旦您調用ITransaction.Execute ,整個批量發送部分就完成了。

這就是無法在 Redis 事務中執行讀取操作的原因。 命令排隊並批量執行,因此,一旦 bacthing 結束,您可以繼續執行任何操作,這不會作為包裝事務的一部分......

OP在一些評論中說......

也許你能給我一些建議? 因為我需要從列表中獲取項目並在刪除這些項目之后。 而這些操作必須是線程安全的。

線程安全與 Redis 事務完全沒有關系。 您負責將某些鎖定方法作為應用程序層的一部分來實現。 好吧,您也許可以使用 Redis 作為進程間或多線程鎖標志存儲來實現該 在官方 Redis 站點上的這篇文章中閱讀有關此內容的信息。

實際上,請查看其他問答: StackExchange.Redis - LockTake / LockRelease Usage

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM