Memcached высокая вставка / обновление вызывают взаимоблокировки - PullRequest
1 голос
/ 11 октября 2011

Я записываю уникальные просмотры страниц с использованием memcached и сохраняю их в дБ с интервалом 15 минут. Всякий раз, когда число пользователей увеличивается, memcached выдает мне следующую ошибку:

Memcache::get(): Server localhost (tcp 10106) failed with: Failed reading line from stream (0)

Я использую следующий код для вставки / обновления просмотров страниц в memcached

if($memcached->is_valid_cache("visiors")) {
    $log_views = $memcached->get_cache("visiors");
    if(!is_array($log_views)) $log_views = array();
}
else {
    $log_views = array();
}
$log_views[] = array($page_id, $time, $other_Stuff);
$memcached->set_cache("visiors", $log_views, $cache_expire_time);

Следующий код извлекает массив из memcached, обновляет число X просмотров страниц в db и устанавливает остальные просмотры страниц в memcached

if($memcached->is_valid_cache("visiors")) {
   $log_views = $memcached->get_cache("visiors");
   if(is_array($log_views) && count($log_views) > 0) {
        $logs = array_slice($log_views, 0, $insert_limit);        
        $insert_array = array();
        foreach($logs as $log) {
            $insert_array[] = '('. $log[0]. ',' . $log[1] . ', NOW())';
        }
        $insert_sql = implode(',',$insert_array);
        if(mysql_query('INSERT SQL CODE')) {
            $memcached->set_cache("visiors", array_slice($log_views, $insert_limit), $cache_expire_time); //store new values
        }
    }
 }

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

1 Ответ

0 голосов
/ 11 октября 2011

Вероятно, вы сталкиваетесь с лимитом подключения в memcached, брандмауэре, сети и т. Д. У нас есть простой обзор самых распространенных сценариев: http://code.google.com/p/memcached/wiki/Timeouts

Нет внутренней блокировки, которая бы вызывала или блокировала наборы на любое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...