0

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

4

1 回答 1

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找到。这样我们就可以更快地修复它们。

于 2011-05-16T18:49:27.737 回答