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