Best practices

James Robinson jlrobins at socialserve.com
Fri Jan 20 14:48:22 UTC 2006


Joshua,

	With respect to how to keep cache-deletes up-to-date with db-deletes  
(or updates for that matter), we use database triggers on tables  
whose data is known to be cached to log row ids into a 'cache-is- 
dirty' table. Then periodically an external database client  
("sweeper" / "invalidator") wakes up, drains all rows from the cache- 
is-dirty table, then fires off the appropriate memcache delete  
commands. We don't do so many bulk-deletes (or updates) on our cached  
data, so this has worked well for us so far. If the number of  
individual rows which expand from a 'where category_id = N' type  
delete clause is 'reasonable', I'd expect this pattern to also work  
in this case.

	This pattern saves you from having to maintain an index in the cache  
itself, whose downsides include costing cache memory, could get  
expunged from the cache in tight-memory times, and, most importantly  
forces you to fetch the index object plus your real data every page hit.

	The DB knows exactly what rows gets deleted / updated, be it through  
your applogic or through low-level SQL ops. Use triggers to preserve  
that information in such a way so that it can be made useful for  
purging from caches also.

	We lifted this design from slony-I (www.slony.info).  It is also  
similar in philosophy to the pgmemcache project, although that embeds  
the memcache client C API directly into the database backend as  
opposed to using an external process to do the talking to memcache.  
(http://pgfoundry.org/projects/pgmemcache/)

----
James Robinson
Socialserve.com



More information about the memcached mailing list