2014-06-09 78 views
3

非常令人討厭的崩潰StackExchange.RedisSetAdd(key, val)StackExchange.Redis SetAdd(key,val)使用key = GUID崩潰

我想設置一個程序GUID作爲關鍵的集合。

我發現SetAdd(key, val)作品與一些GUID,但崩潰與他人(3小時的調試後):

 string key = "02639d71-0935-35e8-9d1b-9dd1a2a34629"; 
     const string val = "somevalue"; 

     db.SetAdd(key, val); // <=== Works 

     key = "02639d71-0935-35e8-9d1b-9dd1a2a34627"; 
     db.SetAdd(key, val); // <=== CRASH @@[email protected][email protected]! 

不同的是最後一個字符 「9」 與 「7」

隱而不宣」 t SetAdd使用本地GUID作爲密鑰?

環境:C#的.NET 4贏8.1 VS2013

崩潰消息:

An unhandled exception of type 'StackExchange.Redis.RedisServerException' occurred in StackExchange.Redis.dll 
Additional information: WRONGTYPE Operation against a key holding the wrong kind of value 

所述的碰撞點在StackExchange.Redis

enter image description here

...

我測試此代碼在LINQPad中。它在同一個地方崩潰。第一個GUID起作用,第二個不起作用。

它接縫的崩潰不是由於這是首發應用GUID。

用不同的GUID進行更多的測試。只有以'7'結尾的那個崩潰。

key = "02639d71-0935-35e8-9d1b-9dd1a2a34622"; 
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34623"; 
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34624"; 
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34625"; 
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34626"; 
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34627"; // <= crashes 
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34628"; 
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34629"; 

...

KeyExistsStringIncrementStringSet與關鍵=我的GUID工作做好。

回答

5

Redis鍵是不透明的。該消息:

WRONGTYPE針對一鍵操作抱着一種錯誤的價值

只是意味着你已經預先存儲在類型,它是不是一個「套」的那個關鍵數據。嘗試(在redis-cli中):

TYPE "02639d71-0935-35e8-9d1b-9dd1a2a34627" 

它會告訴你現有數據的數據類型。如果密鑰不存在,或者存在並且是一組,則只能使用SADD。 OMG。

+1

OMG。它崩潰了,因爲我之前已經使用該鍵存儲了一個字符串。誰寫這些錯誤信息?爲什麼消息不是「數據庫已經包含其他元素,使用不同的密鑰!」..非常感謝。 +1 –

+2

@Miroslav「誰寫這些錯誤信息?」該錯誤是逐字從服務器,所以可能Salvatore Sanfilippo :) –

+1

我知道這一點。 :)自1986年以來,我一直在進行編程,但是我被這個例外誤導了(有3天的Redis經驗)。我從'StackExchange.Redis'的角度來搜索關鍵字類型有什麼問題。可憐的我 :) –