Методы spymemcached get и incr дают совершенно разные результаты

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


person Simon    schedule 08.05.2011    source источник


Ответы (1)


Некоторое время назад для этого была зарегистрирована проблема (ошибка 41 в spymemcached). Вот что сказал по этому поводу Дастин Саллингс, создатель 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. Так мы сможем исправить их быстрее.

person mikewied    schedule 16.05.2011