memcached counters missing in action

Charlie Spurr cspurr at kayak.com
Fri Mar 24 18:47:42 UTC 2006


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