【问题标题】:spymemcached get and incr methods give wholly different resultsspymemcached get 和 incr 方法给出完全不同的结果
【发布时间】:2011-05-08 17:14:44
【问题描述】:
我在我的 Java 项目中使用 spymemcached 2.6rc1,我想将 Long 类用作可存储对象。不幸的是,当我存储例如new Long(0) 对象,get(...) 和 incr(...) 给出完全不同的结果 - get 给出包含 48 个值的 Long 对象,而 incr 给出 1。
请注意,48 代表 ASCII“0”符号。当我尝试直接从 memcached(例如通过使用 telnet)获取相同键的值时,我得到了正确的结果 - 0。奇怪的是,Long 是很好的序列化类。因此,默认转码可能存在一些问题。有人可以澄清如何解决这种情况吗?
【问题讨论】:
标签:
java
transcoding
spymemcached
【解决方案1】:
不久前有一个问题提交(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 找到它。这样我们就可以更快地修复它们。