There are a lot of different ways that people use memcached and PHP. The most common of which is probably your basic set and get to cache data from your database.
-
function get_my_data1() {
-
$cache_id = "mykey";
-
$data = $memcache_obj->get($cache_id);
-
if ( !$data ) {
-
$data = get_data_from_db_function();
-
$memcache_obj->set($cache_id, $data, $sec_to_cache_for);
-
}
-
return $data;
-
}
But what if the query that’s going to hit the database is pretty intensive and you don’t want more than one user to hit the db at a time? That’s easily handling via a semaphore lock.
-
function get_my_data2() {
-
$cache_id = "mykey";
-
$data = $memcache_obj->get($cache_id);
-
if ( !$data ) {
-
// check to see if someone has already set the lock
-
$data_lock = $memcache_obj->get($cache_id . ‘_qry_lock’);
-
if ( $data_lock ) {
-
$lock_counter = 0;
-
// loop until you find that the lock has been released. that implies that the query has finished
-
do while ( $data_lock ) {
-
// you may only want to wait for a specified period of time.
-
// one second is usually sufficient since your goal is to always have sub-second response time
-
// if you query takes more than 1 second, you should consider "warming" your cached data via a cron job
-
if ( $lock_counter > $max_time_to_wait ) {
-
$lock_failed = true;
-
break;
-
}
-
// you really want this to be a fraction of a second so the user waits as little as possible
-
// for the simplicity of example, I’m using the sleep function.
-
$data_lock = $memcache_obj->get($cache_id . ‘_qry_lock’);
-
}
-
// if the loop is completed, that either means the user waited for too long
-
// or that the lock has been removed. try to get the cached data again; it should exist now
-
$data = $memcache_obj->get($cache_id);
-
if ( $data ) {
-
return $data;
-
}
-
}
-
// set a lock for 2 seconds
-
$memcache_obj->set($cache_id . ‘_qry_lock’, true, 2);
-
$data = get_data_from_db_function();
-
$memcache_obj->set($cache_id, $data, $sec_to_cache_for);
-
// don’t forget to remove the lock
-
$memcache_obj->delete($cache_id . ‘_qry_lock’);
-
}
-
return $data;
-
}
More below the break –> Read More…
Posted under PHP, Tips & Tricks, Web Development, mysql
This post was written by Michael Tougeron on January 11, 2008
