簡體   English   中英

StackExchange.Redis:有關交易的幾個問題

[英]StackExchange.Redis: couple of questions about transactions

關於使用StackExchange.Redis的事務,我有幾個問題:

  1. 是否允許在事務中執行可能針對集群環境中的不同節點的命令? 說,第一個命令的鍵具有{1}主題標簽,第二個命令的鍵具有{2}主題標簽。
  2. 事務的Execute() / ExecuteAsync()何時返回false 只有不滿足設定條件時? 如果沒有設置條件,它可以返回false嗎?
  3. 如果發生某些網絡錯誤或內部Redis錯誤, Execute() / ExecuteAsync()拋出還是返回false 我是否還應該檢查命令的任務(假設命令是完全正確的,並且通常不會拋出該命令),否則它們將被取消?

不幸的是, 該文檔沒有詳細解釋#2和#3。

我已經深入研究了StackExchange.Redis源代碼並使用了驅動程序,這是我的觀察結果:

  • ITransaction實例上調用op方法時,沒有實際的交互發生
  • 僅當您調用Execute() / ExecuteAsync()時,驅動程序才開始與Redis對話

答案似乎如下:

  1. 正如@ royi-mindel所提到的,事務中的所有鍵都必須針對同一插槽。 否則,您將收到“多鍵操作必須涉及一個插槽”異常。
  2. Execute() / ExecuteAsync()在兩種情況下返回false :當由於不滿足條件而放棄事務時,以及驅動程序未能將命令排隊時(例如由於服務器OOM)。 所有命令任務將被標記為已取消。 如果其中一個命令在執行過程中失敗(例如,由於錯誤的類型操作),則Execute() / ExecuteAsync() 不會返回false
  3. 萬一發生網絡問題, Execute() / ExecuteAsync()將拋出異常,所有命令任務將保持“等待激活”狀態。

綜上所述,僅在Execute() / ExecuteAsync()返回true時,才應檢查命令任務:每個任務將包含結果或錯誤(請參見Exception屬性)。

  1. “ Redis Cluster實現了Redis的非分布式版本中所有可用的單鍵命令。只要鍵都屬於同一個節點,就可以執行執行復雜的多鍵操作(如Set類型並集或交集)的命令。” https://redis.io/topics/cluster-spec

您不能使用多集群鍵發送多鍵操作。

  1. “在交易期間,可能會遇到兩種命令錯誤:

命令可能無法排隊,因此在調用EXEC之前可能會有錯誤。 例如,命令可能在語法上是錯誤的(錯誤的參數數量,錯誤的命令名稱等),或者可能存在一些嚴重的情況,例如內存不足情況(如果服務器使用maxmemory配置為具有內存限制)指示)。

調用EXEC后,命令可能會失敗,例如,因為我們對具有錯誤值的鍵執行了操作(例如,針對字符串值調用了列表操作)。” https://redis.io/topics/transactions

  1. 在.Net中,當您運行任務時,如果在其中拋出未處理的異常-除非您使用taskInstance.Wait(),否則它不會冒泡在任務外部-然后,您將獲得AggregateException並需要檢查InnerExceptions來查看實際的異常。

暫無
暫無

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

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