Java SpymeCached get和incr方法给出了完全不同的结果

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

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

不久前有一个问题提交了(Spymecached bug 41)。以下是Spymecache的创建者Dustin Sallings对此问题的看法:

不能混合使用整数Transcoder和递增/递减。递增/递减要求数字为 编码为字符串,因为它们是与语言无关的服务器端操作

下面是一个单元测试,它演示了您正在尝试执行的操作:

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将在非数字字符串值上失败。就是, 您的第一个增量将引发异常

以后请在SpymeCached项目网站上提交错误。可在以下网址找到。这样我们可以更快地修复它们