Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 强制memcached写入池中的所有服务器_Php_Memcached_Reliability - Fatal编程技术网

Php 强制memcached写入池中的所有服务器

Php 强制memcached写入池中的所有服务器,php,memcached,reliability,Php,Memcached,Reliability,我考虑过如何确保将特定密钥分发到池中的所有memcached服务器 我目前未经测试的解决方案是制作另一个memcached实例,类似于: $cluster[] = array('host' => '192.168.1.1', 'port' => '11211', 'weight' => 50); $this->tempMemcached = new Memcached; $this->tempMemcached->addServers($cluster);

我考虑过如何确保将特定密钥分发到池中的所有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();

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

我认为您忽略了Memcached的要点。这不是为了可靠的数据存储。它用于非常快速地访问缓存数据。如果您想要冗余,请尝试像MongoDB这样的NOSQL数据库

此外,创建多个连接会对性能和冗余造成不利影响(它需要建立的连接越多,出错的可能性就越大,并且它需要为每个请求执行的操作也越多)


简化,不要复杂化…

我认为您没有按照设计的方式使用memcached。看一下:您应该只存储项目的单个副本,根据使用的哈希算法,该副本会将项目放在某个节点上

现在,如果您希望在所有节点中都有一个可用项,唯一的方法就是迭代,就像您现在所做的那样


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

我们必须“分散”在memcache服务器上频繁命中的密钥的负载。我们只需添加一个随机数0-N,其中N是已配置实例数的倍数。如果没有找到,就转到源代码(数据库,随便什么)。我说的是倍数,因为memcache对您的密钥进行哈希运算,所以您可能会在不知情的情况下发生bucketing冲突

这可能会导致从源代码进行更多读取的前期成本(与N的倍数成正比),但可以将一个键的负载分散到所有实例中,使这些框保持愉快


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

嗨!我知道这一点,但需要存储在所有服务器上的密钥很少,因此我认为连接的数量可能是“合理的”。我确信有更好的方法可以做到这一点!你在读取数据时必须遵循同样的过程。@Seun-我知道:)@Everyone:悬赏开始了@工业:这是你能得到的最好的。正如其他人所说,这不是memcached的本意,因此创建者实施某种复制机制是没有意义的。迭代是唯一的方法。我遇到了一个用例,我让应用程序a向memcache发出大量请求,因此使用哈希/分片方法。但是,有一个密钥使用不同的memcache客户端(不经常)通过应用程序B放入缓存,并由应用程序a访问。如何确保该密钥映射到应用程序a和B的同一节点?我能想到的唯一答案是,将相同的密钥写入每个节点。