我正在使用memcached记录唯一的页面视图,并以15分钟的间隔将它们存储在db中。每当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检索数组,更新db中的X页面视图,并在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读错误并使这段代码完美?
答案 0 :(得分:0)
您可能在memcached,防火墙,网络等中遇到连接限制。我们可以通过简单的方式了解最常见的情况:http://code.google.com/p/memcached/wiki/Timeouts
没有任何内部锁定会导致集合或在任何时间内阻塞。