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

发布于 2024-11-05 14:45:59 字数 286 浏览 1 评论 0原文

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

I use spymemcached 2.6rc1 in my Java project where I want to use the Long class as a storable object. Unfortunately, when I store e.g. new Long(0) object, the get(...) and incr(...) give the wholly different results - get gives Long object that contains 48 value and incr gives 1.
Please note that 48 represents the ASCII "0" symbol. When I try to get the value for the same key directly from memcached (e.g. by using telnet) I get the correct result - 0. Strange, the Long is good serialized class. So, probably, there is some problem with default transcoding. Can somebody clarify how to resolve this situation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

网白 2024-11-12 14:45:59

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

There was an issue filed for this a while back (spymemcached bug 41). Here's what Dustin Sallings, the creator of Spymemcached said about the issue:

You can't mix IntegerTranscoder and incr/decr. incr/decr require the numbers to be
encoded as strings as they are language-agnostic server-side operations.

Here's a unit test that demonstrates what you're trying to do:

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));
}

Note that the reason you get 49 is because decimal 49 is the string "1".

incr and decr cause a lot of confusion for people because of the server-side
semantics. In newer version of memcached (e.g. changes I don't have applied yet in
my binary branch), incr and decr will fail on non-numeric string values. That is,
your first incr would throw an exception.

In the future please file bugs at the Spymemcached project website. It can be found at http://code.google.com/p/spymemcached. That way we can fix them sooner.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文