我前面有一个mysql数据库和一个缓存(memcached)。
基本上我不想允许任何请求进入我的数据库。相反,所有请求都应由缓存来回答。
但是,缓存每10分钟刷新一次,然后请求进入我的数据库,直到使用最新数据更新缓存。但这可能会导致交通量激增一段时间!!
如果再次更新缓存,我怎么能阻止请求或让其中一个请求进入我的数据库?
$get_result = $memcache->get('key'); //retrieve memcached data if possible
if($get_result){
// Show the memcached result
}else {
// Make request to the database
...
// and re-set the cache
$memcache->set('key', $get_result, false, 600);
}
答案 0 :(得分:0)
以下是完全理论化的,因为我不懂PHP。但它使用C接口,所以我认为它也应该在Web服务中工作。
有两个时间常数,您需要仔细选择它们。一个是你愿意等待缓存填充的时间。我建议您花费大约一半的时间来重新填充,尽管如果重新填充时间(数据库查找)很高,它可能会更少。轮询memcached不会花费那么多,但你不想每三微秒做一次,我不这么认为。另一个是第一行中特殊令牌的到期。我将其设置为1(一秒),因为这是可能的最小值,但它不应小于预期的重新填充时间。当然,预期的补充时间通常不到一秒钟。
注意:我使用了memcached接口,它不需要在add / set上使用flags参数。我相信它使用了更新的C库。
// This string must never be produced from the database.
// Also, the empty string must never be possible.
$WAIT_FOR_IT = '**WAIT**'
do {
// The WAIT special value must expire quickly; otherwise, a failed
// task could hang all other requesters for the same key.
if ($memcache->add('key', $WAIT_FOR_IT, 1)){
$get_result = db_lookup('key');
$memcache->set('key', $get_result, 600);
} else {
$get_result = $memcache->get('key')
if ($get_result == $WAIT_FOR_IT){
// We get here if someone else is supposedly working on the value.
// Don't wait very long.
usleep(5000)
$get_result = FALSE
}
}
} while (!$get_result)