在Memcached中出现重复键

4
我在我的php网站上遇到了一些memcache的问题。偶尔我会收到报告说网站表现不佳,当我查看memcache时,我发现集群中的几个键存在于两个服务器上。这两个条目之间的数据不同(其中一个更旧)。
我对memcached的理解是不应该出现这种情况...客户端应该对键进行哈希处理,然后始终选择相同的服务器。所以要么我的理解是错误的,要么我的代码有问题。有人能解释一下为什么会出现这种情况吗?
顺便说一句,这些服务器托管在Amazon EC2上。
我所有连接到memcache的连接都通过这个函数打开:
$mem_servers = array(
    array('ec2-000-000-000-20.compute-1.amazonaws.com', 11211, 50),
    array('ec2-000-000-000-21.compute-1.amazonaws.com', 11211, 50)
);

function ConnectMemcache()
{
     global $mem_servers;
     if ($memcon == 0) {
          $memcon = new Memcache();
          foreach($mem_servers as $server) $memcon->addServer($server[0], $server[1], true);
     }
     return($memcon);
}

并且数值是通过这个存储的:

function SetData($key,$data)
{
    global $mem_global_key;
    if(MEMCACHE_ON_OFF)
    {
        $key = $mem_global_key.$key;
        $memcache = ConnectMemcache();
        $memcache->set($key, $data);
        return true;
    }
    else
    {
        return false;
    }
}
1个回答

1

我认为这篇博客文章涉及到了你所遇到的问题。

http://www.caiapps.com/duplicate-key-problem-in-memcache-php/

从文章中可以看出以下情况发生了:
- 一个原本拥有该键的存储器缓存服务器掉线了
- 该键在第二台服务器上被重建,并更新了数据
- 第一台服务器重新上线并进入了与旧数据相同的集群。
- 现在,你在两个保存不同数据的服务器上都有了这些键
听起来你可能需要使用Memcache::flush来清除存储器缓存集群,然后再进行写操作,以帮助尽量减少集群中存在重复时间的长度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接