spymemcached методы get и incr дают совершенно разные результаты - PullRequest
0 голосов
/ 08 мая 2011

Я использую spymemcached 2.6rc1 в своем проекте Java, где я хочу использовать класс Long в качестве хранимого объекта.К сожалению, когда я сохраняю, например, новый объект Long (0), get (...) и incr (...) дают совершенно разные результаты - get дает объект Long, который содержит значение 48, а incr дает 1. Обратите внимание, чтопредставляет символ ASCII "0".Когда я пытаюсь получить значение для того же ключа непосредственно из memcached (например, с помощью telnet), я получаю правильный результат - 0. Странно, Long - хороший сериализованный класс.Так что, возможно, есть проблема с транскодированием по умолчанию.Может кто-нибудь уточнить, как разрешить эту ситуацию?

1 Ответ

2 голосов
/ 16 мая 2011

Некоторое время назад возникла проблема (spymemcached bug 41).Вот что Дастин Саллингс, создатель Spymemcached, сказал о проблеме:

Нельзя смешивать 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. Таким образом, мы сможем исправить их раньше.

...