memcached counters missing in action

Greg Whalin gwhalin at
Fri Mar 24 21:35:11 UTC 2006

memcached assumes a 32 bit unsigned int.  Decrementing below 0 will just
return 0.  -1 is never a valid result and can only really signify an
error condition.

Charlie Spurr wrote:
> Ah, yes, then I've misunderstood what the expiration setting
> controls. Thanks for clarifying. So, setting an expiration on
> a counter is not useful to me then.
> One last question, if I'm decrementing a counter down to zero
> by amounts greater than 1, I need to distinguish between the
> "object not found" case and a valid -1 result (e.g. decr
> a counter by 50 whose current value is 49). Is there a way
> to make this distinction or should I just scale up my counters
> to avoid approaching zero?
> Thanks,
> Charlie Spurr
> On Mar 24, 2006, at 3:46 PM, Greg Whalin wrote:
>> No, the incr/decr calls will return -1 when the object is not found in
>> cache.  I am somewhat confused by your line of questioning.  Are you
>> assuming that setting an expiration will ensure that the object lives in
>> cache for that duration?  That is not what an expiration does.  Setting
>> an expiration ensures that the object will NOT live in cache past the
>> expire.  It makes no promises that the object will be there until the
>> expiration.
>> gw
>> Charlie Spurr wrote:
>>> Bummer...
>>> So, if I understand what's been said so far, I have to call
>>> getCounter prior to every decr call to see if the counter is
>>> still in the cache. If it's not in the cache reload it using
>>> storeCounter and then I can call the decr method.
>>> Is that right?
>>> _Charlie
>>> On Mar 24, 2006, at 3:23 PM, Greg Whalin wrote:
>>>> Nope, that won't work.  That will store a serialized Long(1000) object
>>>> to the cache.  Calling incr() or decr() on it will reset it to 0
>>>> (according to the api docs).
>>>> Charlie Spurr wrote:
>>>>> Greg,
>>>>> Yes, I would like to set an expiration time on counters so
>>>>> please add that to the queue for improvements for the Java
>>>>> client.
>>>>> In the meantime, would this work...
>>>>> Long balance = new Long(10000);
>>>>> MemCachedClient = MemCachedClient();
>>>>> client.set("Balance1", balance, expireDate);
>>>>> client.decr("Balance1", 50);
>>>>> client.getCounter("Balance1");
>>>>> or would I have to use (Long)client.get("Balance1");
>>>>> instead of getCounter?
>>>>> _Charlie

More information about the memcached mailing list