memcached中的重复键

时间:2012-02-02 18:44:44

标签: php amazon-ec2 memcached

我的php网站上有一些memcache的问题。偶尔我会得到一个报告,该网站是行为不端的,当我看到memcache时,我发现群集中的两个服务器上都存在一些密钥。两个条目之间的数据不同(一个是较旧的)。

我对memcached的理解是,这不应该发生......客户端应该对密钥进行散列,然后始终选择相同的服务器。所以要么我的理解是错的,要么是我的代码。任何人都可以解释为什么会发生这种情况吗?

FWIW服务器托管在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 个答案:

答案 0 :(得分:1)

我认为这篇博文会触及您遇到的问题。

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

从文章中可以看出发生以下情况:
- 具有密钥的memcache服务器最初退出 - 使用更新的数据在第二台服务器上重新创建密钥 - 第一台服务器重新联机并使用旧数据进入群集 - 现在您可以将密钥保存在具有不同数据的2台服务器上

听起来你可能需要使用Memcache :: flush在写入之前清除memcache集群,以帮助最小化集群中可能存在的重复项。