2011-05-08 139 views
0

我在我的Java項目中使用spymemcached 2.6rc1,我想使用Long類作爲可存儲對象。不幸的是,當我存儲例如新的Long(0)對象,get(...)和incr(...)給出了完全不同的結果 - get給出包含48值的Long對象,並且incr給出1. 請注意,48代表ASCII「0 「符號。當我嘗試直接從memcached獲取同一個鍵的值時(例如通過使用telnet),我得到了正確的結果-0。奇怪的是,Long是很好的序列化類。所以,很可能,默認代碼轉換存在一些問題。有人可以澄清如何解決這種情況?spymemcached get和incr方法給出了完全不同的結果

回答

2

有一個問題提交了一段時間後(spymemcached bug 41)。以下是Spymemcached的創始人Dustin Sallings對此問題所說的內容:

您不能混用IntegerTranscoder和incr/decr。 incr/decr要求編號爲 編碼爲字符串,因爲它們是語言不可知的服務器端操作。

這裏有一個單元測試,證明你想要做什麼:

public void testIncrDecrBug41() throws Exception { 
    final String key="incrdecrbug41"; 

    // set to zero 
    client.set(key, 86400, "0"); 

    // retrieve it to see if it worked 
    assertEquals("0", client.get(key)); 

    // increment it 
    assertEquals(1, client.incr(key, 1)); 

    // fetch it again to see if it worked 
    assertEquals("1", client.get(key)); 
} 

請注意,您收到49的原因是因爲十進制49是字符串「1」。

因爲服務器端的語義,incr和decr會導致人們很大的困惑。在較新版本的memcached中(例如,我沒有在 我的二進制分支中應用的更改),incr和decr將在非數字字符串值上失敗。那就是, 你的第一個incr會拋出異常。

未來請在Spymemcached項目網站上提交bug。它可以在http://code.google.com/p/spymemcached找到。這樣我們可以儘快解決它們。

相關問題