以下内容完全是理论上的,因为我不懂 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)