我已经考虑过如何确保将特定密钥分发给池中的所有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();
在这种情况下,当需要将某些密钥存储在所有服务器上以确保可靠性时,常识是什么?
答案 0 :(得分:6)
我认为你没有按照它的设计方式使用memcached。请查看FAQ:您应该只存储项目的单个副本,根据所使用的哈希算法,它会将您的项目放在某个节点上。
现在,如果您希望在所有节点中都有一个项目,那么唯一的方法就是迭代,就像您现在正在做的那样。
我希望您的代码能够处理在缓存中找不到此项的情况。
答案 1 :(得分:4)
我认为你错过了Memcached的观点。它不适用于可靠的数据存储。这是非常快速访问缓存数据。如果您想要冗余,请尝试使用像MongoDB这样的NOSQL数据库...
此外,创建多个连接会对性能和冗余造成不利影响(需要建立的连接越多,出错的可能性就越大,每个请求需要做的就越多)。
简化,不要复杂......
答案 2 :(得分:1)
我们不得不“扩散”密钥的负载,这些密钥在memcache服务器上非常频繁地受到攻击。我们通过简单地附加一个随机数0-N来实现这一点,其中N是您配置的实例数的倍数。如果你错过,你去源(数据库,无论如何)。我说一个倍数,因为memcache对你的密钥进行哈希处理,你可能会在不知情的情况下发生冲突。
这可能导致从源获取更多读取的前期成本(与N的倍数成比例),但是可以在所有实例中分散一个键的负载,从而使这些框保持开心。
但是,这不是为了冗余,而是用于负载平衡。