我试图使用Predis sharding别名,因为described here。我的代码基本相同,但我只返回空数组。我的哈希键需要在他们周围吗? (编辑:不,就试了一下)Predis Alias Sharding
$api->get("/test", function() {
$servers = [
["alias" => "metadata", "port" => 6380],
["alias" => "relations", "port" => 6381],
["alias" => "dim_provider", "port" => 6382],
["alias" => "dim_revctrcode", "port" => 6383],
["alias" => "dim_enccode", "port" => 6384],
["alias" => "dim_pos", "port" => 6385]
];
$options = [
"nodehash" => function ($connection) { return $connection->getParameters()->alias; },
"cluster" => function ($options) {
$replicas = Predis\Cluster\Distribution\HashRing::DEFAULT_REPLICAS;
$hashring = new Predis\Cluster\Distribution\HashRing($replicas, $options->nodehash);
$cluster = new Predis\Connection\PredisCluster($hashring);
return $cluster;
}
];
$redis = new Predis\Client($servers, $options);
try {
$test = $redis->scard("dim_provider");
print_r($test); // Prints 0 for scard or empty Array for hgetall
} catch (Exception $e) {
print $e->getMessage();
}
$redis = new Predis\Client(["port" => 6382]);
$test = $redis->scard("dim_provider");
print_r($test); // Works.
});
编辑:它也可以,如果我只放了一台服务器$servers
阵列英寸所以看起来哈希算法并不正确。当我在nodehash
的返回值前面抛出一些回声时,我可以看到它正在返回别名。
谢谢。很明显,我误解别名分片。我的目标是将每个维度托管在一个单独的分片上。假设我有一个名为'dim_provider'的集合,并使用了名为'dim_provider:id'的散列,API将连接到redis集群并根据所需的密钥知道要去哪个服务器。我是否需要编写自己的分销策略?在我的PHP脚本中映射key:port对可能会更容易。 – 2013-03-02 15:07:16
通常,在使用客户端分片时,您不关心要存储哪些服务器密钥,理想情况下,密钥空间均匀分布在您的Redis实例中。通过分配'weight'参数或使用密钥标签来确保某些密钥组存储在同一个分片上,通过计算散列值只能在包含在{}中的密钥部分中,确实可以平衡每台服务器上的负载,但是您将无法基于密钥强制执行目标服务器。 – nrk 2013-03-02 16:31:10
从某种意义上说,您的用例可以被看作是一种非常专业化的分区,但与用于通过客户端分片分发密钥的常用策略无法很好地发挥作用。考虑你试图达到的目标,我只是使用'Predis \ Client'的多个实例,每个服务器都有一个实例,但是没有什么能阻止你通过实现分析每个Redis的'Predis \ Connection \ ClusterConnectionInterface'编写你自己的集群后端类命令来决定使用哪个服务器。定制化毕竟是Predis的卖点之一。 – nrk 2013-03-02 16:32:06