jsxiao / spymemcached

Automatically exported from code.google.com/p/spymemcached
0 stars 0 forks source link

set() a Integer to zero; incr() by 1; get() returns 49 as the value #41

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
What version of the product are you using? On what operating system?
2.2 on Linux

Tell me more...

MemcachedClient mc = new MemcachedClient(...);
IntegerTranscoder it = new IntegerTranscoder();
Integer temp_int = null;

// set to zero
mc.set("some_key", 86400, new Integer(0), it);

// retrieve it to see if it worked
temp_int = (Integer) mc.get("some_key", it);
System.out.println(temp_int.intValue()); // <<-- ok so far (outputs "0")

// increment it
System.out.println(mc.incr("some_key", 1)); // << -- outputs "1"

// fetch it again to see if it worked
temp_int = (Integer) mc.get("some_key", it);
System.out.println(temp_int.intValue()); // <<-- bad (outputs "49")

Original issue reported on code.google.com by tankb...@gmail.com on 24 Dec 2008 at 3:30

GoogleCodeExporter commented 8 years ago
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.

Original comment by dsalli...@gmail.com on 24 Dec 2008 at 8:48