我在我的Java项目中使用spymemcached 2.6rc1,我希望将Long类用作可存储对象。不幸的是,当我存储例如新的Long(0)对象,get(...)和incr(...)给出完全不同的结果 - 得到给出包含48值的long对象,incr给出1。 请注意,48表示ASCII“0”符号。当我尝试直接从memcached获取相同密钥的值时(例如通过使用telnet),我得到了正确的结果 - 0.奇怪的是,Long是一个很好的序列化类。因此,默认转码可能存在一些问题。有人可以澄清如何解决这种情况吗?
答案 0 :(得分: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项目网站上提交错误。它可以在http://code.google.com/p/spymemcached找到。这样我们就可以更快地解决它们。