How To Distinguish Between a Crashed Server and Non-Existent Memcached Key Value?

Andreas Vierengel avierengel at gatrixx.com
Sun Jun 4 15:38:28 UTC 2006


Ian Kallen wrote:
> On 6/4/06, Andreas Vierengel <avierengel at gatrixx.com> wrote:
>> that's right, but it could lead to a nice DoS-Attack especially if (for
>> example) a web-request leads to a specific key which cannot be filled
>> from the original source, because the original source produces 'undef'
>> as well.
> 
> If there is a high frequency of null result lookup cases on the data
> origin and you're concerned with the costs of those lookups, then
> implement a negative cache.  The negative cache interval should be
> sized by how tolerant your applications are of having no result when
> in fact there may be one.
> 
> Here's some babytalk code to illustrate how to typically handle it:
> 
> rv = getMemcacheVal(key);
> if (rv == null) { // memcache said "nope"
>    rv = getExpensiveVal(key); // poor performing mysql indices, etc
>    if (rv == null) { // rdbms said "nope"
>        putNegativeCache(key); // has appropriate TTL
>    } else { // rdbms said "yep"
>        putPositiveCache(key);
>    }
> }
> return rv; // may be undef
> 
>> One solution could be that you never let this happen and always generate
>> a "reasonable" value for this key, or you could hack Cache::Memcached to
>>   add a undef-state using the flags-field.
> 
> Hacking the mecached client to handle the negative case, given the
> various tolerances that applications will have for "false negatives",
> sounds like a bad idea. When I fetch null from memcache, I really
> expect that to mean there's no cache entry for it and have that be
> distinct from a negative cache. But I'd be curious to see a general
> solution if you have one.

I use a self written client in perl, which stores undef values as the 
string "UNDEF" and set some bitfield in the flag-header to true. If I 
fetch a key from memcached an my client returns undef, i question 
another method which returns if the client returned undef because of a 
general error or if the value was simply undef. So I can distinguish 
between negative hits and errors.

--Andy

> -Ian
> 



More information about the memcached mailing list