4

我已经考虑过如何确保将特定密钥分发到池中的所有 memcached 服务器。

我目前未经测试的解决方案是创建另一个 memcached 实例,如下所示:

$cluster[] = array('host' => '192.168.1.1', 'port' => '11211', 'weight' => 50);

$this->tempMemcached = new Memcached;
$this->tempMemcached->addServers($cluster);

foreach ($this->cluster() as $cluster) {    

    $this->tempMemcached->setByKey($cluster, $key, $value, $this->compress, $expireTime);

}

$this->tempMemcache->close();

在这种情况下,当某些密钥需要存储在所有服务器上以确保可靠性时,该怎么做?

4

3 回答 3

6

我认为您没有按照设计的方式使用 memcached。查看常见问题解答:您应该只存储您的项目的一个副本,根据使用的散列算法,该副本会将您的项目放在某个节点上。

现在,如果您想在所有节点中都有一个可用的项目,唯一的方法是通过迭代,就像您目前所做的那样。

我希望您的代码能够处理在缓存中找不到此项目的情况。

于 2010-05-26T13:23:55.270 回答
4

我认为您错过了 Memcached 的重点。它不是为了可靠的数据存储。它用于非常快速地访问缓存数据。如果您想要冗余,请尝试使用 MongoDB 之类的 NOSQL 数据库...

此外,创建多个连接将不利于性能和冗余(它需要建立的连接越多,出错的可能性就越大,并且它需要为每个请求做更多的事情)。

简化,不要复杂...

于 2010-05-23T23:53:38.377 回答
1

我们不得不在 memcache 服务器上“分散”一个经常被命中的键的负载。我们通过简单地附加一个随机数 0-N 来做到这一点,其中 N 是您配置的实例数的倍数。如果你错过了,你就去源头(数据库,不管)。我说的是倍数,因为 memcache 对您的密钥进行哈希处理,您可能会在不知情的情况下发生分桶冲突。

这可能会导致从源读取更多的前期成本(与 N 的倍数成正比),但可以将一个键的负载分散到所有实例中,让这些盒子保持快乐。

但是,是的,这不是为了冗余,而是为了负载平衡。

于 2010-06-03T04:46:48.127 回答