我在Java项目中使用spymemcached 2.6rc1,我想将Long类用作可存储对象。不幸的是,当我存储新的Long(0)对象,get(...)和incr(...)给出完全不同的结果-get给出包含48个值的Long对象,而incr给出1。
请注意,48表示ASCII“ 0”符号。当我尝试直接从memcached(例如通过使用telnet)获取相同键的值时,我得到了正确的结果-0。奇怪的是,Long是很好的序列化类。因此,默认转码可能存在一些问题。有人可以澄清如何解决这种情况吗?

最佳答案

不久前有一个提交的问题(spymemcached错误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上找到。这样我们可以更快地解决它们。

关于java - spymemcached的get和incr方法给出的结果完全不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5928964/

10-11 17:38