我曾考虑过如何确保将特定的键分发到池中的所有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();在这种情况下,当某些密钥需要存储在所有服务器上以保证可靠性时,常识是什么?
发布于 2010-05-26 21:23:55
我认为您没有按照设计的方式使用memcached。看一下FAQ:您应该只存储项目的single copy,根据使用的散列算法,它会将您的项目放在某个节点上。
现在,如果您想让一个项目在所有节点的中都可用,唯一的方法就是迭代,就像您现在正在做的那样。
我希望你的代码能够处理在缓存中找不到这个项目的情况。
发布于 2010-05-24 07:53:38
我认为你错过了Memcached的要点。它不是用于可靠的数据存储。它用于非常快速地访问缓存数据。如果你想要冗余,试试像MongoDB这样的NOSQL数据库...
此外,创建多个连接将不利于性能和冗余(它需要建立的连接越多,出错的可能性就越大,并且需要为每个请求做更多的事情)。
简化,不要复杂化..。
发布于 2010-06-03 12:46:48
我们不得不将频繁命中的键的负载“分散”到memcache服务器上。我们只需添加一个随机数0-N就可以做到这一点,其中N是已配置实例数量的倍数。如果未命中,则转到源文件(数据库,无论什么)。我说的是一个倍数,因为memcache对你的key进行了哈希运算,所以你可能会在不知道的情况下发生冲突。
这可能会导致从源读取更多的前期成本(与N的倍数成正比),但会将一个键的负载分散到所有实例中,使这些框保持满意。
但是,是的,这不是为了冗余,它是为了负载平衡。
https://stackoverflow.com/questions/2893544
复制相似问题