저장 클래스로 Long 클래스를 사용하려는 Java 프로젝트에서 spymemcached 2.6rc1을 사용합니다. 불행히도, 예를 들어 새로운 Long (0) 객체, get (...) 및 incr (...)은 완전히 다른 결과를 제공합니다. get은 48 값을 포함하는 Long 객체를 제공하고 incr은 1을 제공합니다. 48은 ASCII "0 "기호. memcached (예 : 텔넷을 사용하여)에서 동일한 키의 값을 직접 가져 오려고하면 올바른 결과를 얻습니다. 이상합니다. Long은 직렬화 된 클래스입니다. 따라서 기본 트랜스 코딩의 경우 약간의 문제가있을 수 있습니다. 누군가이 상황을 해결하는 방법을 명확히 할 수 있습니까?spymemcached get 및 incr 메서드가 완전히 다른 결과를 반환합니다.
0
A
답변
2
잠시 후 문제가 제기되었습니다 (spymemcached bug 41). 다음은 Spymemcached의 제작자 인 Dustin Sallings가이 문제에 관해 언급 한 내용입니다.
IntegerTranscoder와 incr/decr을 함께 사용할 수 없습니다. incr/decr은 숫자가 인 문자열을 언어에 구애받지 않는 서버 측 작업으로 인코딩해야합니다.
여기 당신이 뭘하려는 건지 보여주는 단위 테스트 : 당신이 49를 얻는 이유는 소수점 49 문자열 "1"이기 때문이다
가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));
}
참고.
서버 측 의미론 때문에 incr과 decr은 사람들에게 많은 혼란을 야기합니다. 새로운 버전의 memcached (예 : 내 바이너리 분기에 아직 적용되지 않은 변경 사항)에서 숫자가 아닌 문자열 값에 대해 incr 및 decr이 실패합니다. 즉, 첫 번째 incr은 예외를 throw합니다.
향후 Spymemcached 프로젝트 웹 사이트에 버그를 신고하십시오. http://code.google.com/p/spymemcached에서 확인할 수 있습니다. 그렇게하면 빨리 해결할 수 있습니다.