2013-05-27 83 views
2

當試圖通過調用RedisConnection.Hashes.Remove(int db,string key,string [] fields,bool queueJump = false)來刪除hash字段時,我得到一個異常說:「ERR 「hdel」命令的參數錯誤數量「。Hash.Exception異常字符串[]

這裏是產生它的代碼:

static void Main(string[] args) 
    { 
     var connection = new RedisConnection("localhost"); 
     connection.Open(); 

     var transaction = connection.CreateTransaction(); 

     // setting values to fields - works fine! 
     for (int index = 0; index < 2; index++) 
     { 
      transaction.Hashes.Set(0, "s1", String.Format("f{0}", index.ToString()), String.Format("v{0}", index.ToString())); 
     } 
     transaction.Execute().Wait(); 

     // Here is where the exception is being thrown 
     connection.Hashes.Remove(0, "s1", new string[] { "f1", "f2" }).Wait(); 

     Console.ReadLine(); 
    } 

我使用Booksleeve 1.3.37.0從拍攝的NuGet。 謝謝,

+0

嗯......那很奇怪;代碼實際上在這裏包含版本檢測測試,以確保使用正確的(可變的/不可變的)版本。你能準確地指出你使用的服務器版本嗎,所以我可以嘗試重新制作? –

回答

3

HDEL manual;

歷史

= 2.4:接受多個字段的參數。早於2.4版的Redis版本只能刪除每個呼叫的字段。

換句話說,您運行的Redis版本早於2.4,因此每次調用只能刪除一個字段。這很有可能會起作用;

connection.Hashes.Remove(0, "s1", new string[] { "f1" }).Wait(); 
connection.Hashes.Remove(0, "s1", new string[] { "f2" }).Wait(); 

(或當然也有可能是調用的一個版本,這並不需要一個數組)

+0

看起來像你是對的:/謝謝 –

1

BookSleeve不執行版本測試,以試圖隱藏從你的這些細微之處;看來這個問題是在版本測試本身:

/// <summary> 
    /// Does HDEL support varadic usage? 
    /// </summary> 
    public bool HashVaradicDelete { get { return version > v2_2_0; } } 

我想這應該是:

/// <summary> 
    /// Does HDEL support varadic usage? 
    /// </summary> 
    public bool HashVaradicDelete { get { return version >= v2_4_0; } } 

HDEL底部讀出的意見,似乎頁面沒有在某些時候非常清楚地列出版本 - 我可能從評論中獲得了我的版本測試:

當前官方穩定版本(2.2)不支持多個字段;我只是追着我的尾巴試圖讓它工作,直到我意識到這個頁面是2.4的文檔,而不是2.2

我很樂意將它改爲> = 2.4 - 但是您能否確認你正在使用什麼服務器版本?

+0

+1版本檢查,只是加快,而不是破壞API :) –

+0

@JoachimIsaksson可能出現,部分原因是因爲很長一段時間,我們的後面幾個版本 - 我我們希望它能夠「正常工作」,但是在我們升級的時候默默地加快速度。 「TakeLock」是另一個很好的例子 - 這個版本的實現在很大程度上發生了變化 –