Php Memcached高插入/更新导致死锁

Php Memcached高插入/更新导致死锁,php,memcached,Php,Memcached,我正在使用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

我正在使用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);
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中检索数组,更新db中的X个页面视图,并在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);
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读取错误并使此代码完美吗?

您可能会在memcached、防火墙、网络等中遇到连接限制。我们简单介绍了最常见的情况:


没有任何内部锁定会导致集合在任何时间内被阻塞。

Memcached正在锁定。这是它的一个特点。切换到正确配置的MySQL后端,它可以更快地进行一致访问,并更好地处理锁定。MySQL不能很好地处理高插入,这就是我添加memcached层的原因。我不同意。但不管怎样,如果memcached(现在)让你陷入高插入,你需要再次切换到其他不需要的东西。如前所述,可以用MySQL来完成,但很自然,您不必绑定MySQL。您如何提出MySQL解决方案?只是简单的插入语句?平均插入速率为每秒500-600。500-600绝对不是想象中的“高”。在最新版本的笔记本电脑上,我可以无限期地维持400000/s(略低于你的100000倍),而且很快就会有新的优化,让你在同样的硬件上更接近800000/s-900000/s。你的使用率可能不太理想,但不是价格。