阻止mysql数据库查询

时间:2013-08-26 16:58:18

标签: php mysql memcached

我前面有一个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); 
}

1 个答案:

答案 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)