memcached counters missing in action
Greg Whalin
gwhalin at meetup.com
Fri Mar 24 20:23:47 UTC 2006
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
>
>
> On Mar 24, 2006, at 2:41 PM, Greg Whalin wrote:
>
>> He is referring to using incr and decr which are most definitely part of
>> the memcached api and not *just* a client abstraction. The
>> storeCounter() and getCounter() methods in the java client are basically
>> just wrappers to set() and get() which do not (de)serialize the int
>> object on the way in/out of the cache. This is done so that incr and
>> decr work correctly on the object in cache.
>>
>> That said, it sounds like an exception is being thrown when the
>> getCounter() method is trying to create a Long object from the value in
>> the cache (crappy error messaging on my part). It would be useful to
>> see what is actually in the cache at that time. Charlie, when you see
>> this again, please telnet into your memcached server and issue a "get
>> key" command and let me know what you find. Also, to answer your
>> questions:
>>
>> 1) the storeCounter() method does not set an expiration, however, the
>> storeCounter() method is basically just a wrapper for set(), so an
>> expiration could most definitely be set. Also, just because an
>> expiration is not set does not mean that the object will live in cache
>> permanently. If the cache fills up, it is entirely possible your
>> counter could be pushed out of cache.
>>
>> 2) if you want to enforce an expiration time, then yes, you need to use
>> set(). However, you need to make sure that you do so in a way that does
>> not serialize the object. This is currently not available in the public
>> API (there is a private method which allows this). If you really
>> want/need an expiration set on a counter, please let me know and I will
>> add it to the queue of improvements to the client.
>>
>> 3) nope ... instead I should fix the stupid error message in
>> getCounter() that says the object is not in cache and instead error
>> correctly "Exception thrown while trying to create Long() on data: %s"
>>
>> Hope this helps.
>>
>> Greg
>>
>> Brad Fitzpatrick wrote:
>>> What's a counter?
>>>
>>> memcached has no such object.
>>>
>>> I assume the Java client gives you such an abstraction. In any case,
>>> they're not magic. They die like the rest.
>>>
>>> - Brad
>>>
>>>
>>> On Fri, 24 Mar 2006, Charlie Spurr wrote:
>>>
>>>> I'm using memcached counters to track budget balances and
>>>> I'm seeing some of the counters mysteriously disappear
>>>> from the cache sometime after a decr of the counter.
>>>>
>>>> Here's what I'm doing for each counter:
>>>> a) At application startup on the primary app server, I
>>>> load the current remaining balance for each budget
>>>> from a MySQL database into a memcached counter using
>>>> the Java MemCachedClient's storeCounter(String key,
>>>> long value) method.
>>>>
>>>> b) As billable events occur asynchronously, I call the client's
>>>> decr(String key, long amount) method to decrement the
>>>> remaining balance in the cache.
>>>>
>>>> c) In a synchronization thread (one per app server, ten total),
>>>> I call the MemCachedClient's getCounter(String key) method
>>>> to retrieve the cached budget balance and sync it back to
>>>> the database.
>>>>
>>>> This seems to run fine for a while until getCounter or decr calls
>>>> start to hit "MemCached.MemCachedClient - counter not found at key:"
>>>> errors. When this occurs, MemCachedClient's keyExists(String key)
>>>> calls return true but getCounter or decr calls fail with this error.
>>>>
>>>> My questions are:
>>>> 1) Do counters expire like Object data expire or are they expected
>>>> to remain in the cache until they are deleted or flushed?
>>>>
>>>> 2) If counters expire, how do I set their expiration time? There is no
>>>> version of MemCachedClient's storeCounter that takes a expire Date
>>>> parameter. Should I be using MemCachedClient's set(String key,
>>>> Object value, Date expiry) instead of (or in combination with)
>>>> storeCounter?
>>>>
>>>> 3) Shouldn't MemCachedClient's keyExists(String key) return false
>>>> when calls to getCounter or decr calls fail with "counter not
>>>> found at key:" errors?
>>>>
>>>> Charlie Spurr
>>>> Kayak.com
>>>>
>>>>
>>
>
More information about the memcached
mailing list