java - pymemcached get 和 incr 方法给出完全不同的结果

标签 java transcoding spymemcached

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

最佳答案

不久前为此提出了一个问题(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 找到。 。这样我们就可以更快地修复它们。

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

相关文章:

java - getParts() 也获取文本输入

php - 使用ffmpeg进行多遍编码的文本的正确方法是什么

video - 使用 ffmpeg/ffprobe 检测视频中 alpha channel 的好方法

java - spymemcached java客户端故障处理无法正常工作: membase server

java - 如何使用 spymemcached 动态添加 memcached 节点

java - executeUpdate() 只给出返回值 1

java - 无法对非静态方法库进行静态引用

java - import java.net.http 无法解析

camera - 嵌入网站的 RTSP 到 HTTP MJPEG 转码

java - 内存缓存+ Spring 缓存