2013-08-26 4 views
0

У меня есть база данных mysql и кеш (memcached) перед ней.Удерживайте запросы базы данных mysql

В принципе, я не хочу, чтобы какой-либо запрос переходил в мою базу данных. Вместо этого на весь запрос должен отвечать кеш.

Однако кеш сбрасывается каждые 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

Похоже, у НУ хочет отключить кэш гиперемию, но вы не кажется, чтобы понять, как работает cahce ... он должен быть в состоянии поразить базу данных, чтобы обновить – gbtimmon

+0

Почему вы промывку всего кэша сразу ? Почему бы не дать 10-минутный TTL для таких элементов, чтобы запросы после того, как TTL попали в базу данных, чтобы повторно заполнить кеш на основе каждого элемента, а не на весь кеш одновременно? –

+0

Даже на основе каждого элемента, если элемент получает покраснение, а затем сразу же запрашивается несколькими 100 людьми, все они идут в БД прямо сейчас –

ответ

0

Следующее полностью теоретическое, поскольку я не знаю PHP. Но он работает с использованием интерфейса C, поэтому я полагаю, что он должен работать и в веб-сервисе.

Существуют две постоянные времени, и вам нужно их тщательно выбрать. Один из них - это время, в которое вы готовы ждать заполнения кеша. Я бы предложил примерно половину времени, которое вы ожидаете от пополнения, хотя это может быть еще меньше, если время перезарядки (поиск базы данных) велико. Опрос memcached не так уж и дорог, но вы не хотите делать это каждые три микросекунды, я не думаю. Другой - это истечение специального токена в первой строке. Я установил его на 1 (одну секунду), потому что это наименьшее возможное значение, но оно не должно быть меньше ожидаемого времени перезарядки. Конечно, ожидаемое время перезарядки обычно будет меньше секунды.

Примечание. Я использовал интерфейс memcached, который не требует параметра flags для add/set. Я считаю, что он использует более новую библиотеку 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) 
Смежные вопросы