Php 预失真别名切分
我正在尝试使用Predis按别名进行切分,如图所示。我的代码基本相同,但我只返回空数组。我的散列键周围需要{}吗?(编辑:没有,只是试了一下)Php 预失真别名切分,php,redis,predis,Php,Redis,Predis,我正在尝试使用Predis按别名进行切分,如图所示。我的代码基本相同,但我只返回空数组。我的散列键周围需要{}吗?(编辑:没有,只是试了一下) 编辑:如果我只在$servers数组中放置一台服务器,它也可以工作。因此,散列似乎无法正常工作。当我在nodehash中的返回值前面抛出一些回声时,我可以看到它正在返回别名。将dim\u提供程序别名分配给Redis连接和尝试从服务器获取名为dim\u提供程序的键是两件不同的事情 在您的脚本中,您试图使用连接别名(而不是通常的ip:port对)来设置一个R
编辑:如果我只在
$servers
数组中放置一台服务器,它也可以工作。因此,散列似乎无法正常工作。当我在nodehash
中的返回值前面抛出一些回声时,我可以看到它正在返回别名。将dim\u提供程序
别名分配给Redis连接和尝试从服务器获取名为dim\u提供程序
的键是两件不同的事情
在您的脚本中,您试图使用连接别名(而不是通常的
ip:port
对)来设置一个Redis实例集群,以计算密钥空间在充当您的连接别名的多个Redis服务器之间的分布。使用此设置,密钥dim\u提供程序
根据基础分发算法进行分片,可以存储在构成集群的6台服务器中的任何一台上,并在$servers
数组中定义。将dim\u提供程序
别名分配给Redis连接,并尝试获取名为的密钥dim_provider
来自服务器是两件不同的事情
在您的脚本中,您试图使用连接别名(而不是通常的
ip:port
对)来设置一个Redis实例集群,以计算密钥空间在充当您的连接别名的多个Redis服务器之间的分布。使用此设置,密钥dim\u provider
根据底层分发算法进行分片,可以存储在构成集群的6台服务器中的任何一台上,并在$servers
数组中定义。我想补充一点,一旦nrk让我走上正轨,实施集群策略是多么容易。这是一个写得很好的图书馆
$api->get("/test", function () {
Class KeyCluster extends Predis\Connection\PredisCluster {
public function __construct() {
$this->pool = Array();
}
public function add (Predis\Connection\SingleConnectionInterface $connection) {
$parameters = $connection->getParameters();
if (isset($parameters->table)) {
$this->pool[$parameters->table] = $connection;
} else {
$this->pool[] = $connection;
}
}
public function getConnection (Command\CommandInterface $command) {
$key = $command->getArgument(0);
$table = explode(":", $key)[0];
return isset($this->pool[$table]) ? $this->pool[$table] : null;
}
}
$redis = new Predis\Client([
"tcp://127.0.0.1:6382?table=dim_provider",
"tcp://127.0.0.1:6383?table=dim_pos"
],[
"cluster" => new KeyCluster
]);
$result = $redis->scard("dim_provider");
print_r($result);
});
我想补充一点,一旦nrk让我走上正轨,实现集群策略是多么简单。这是一个写得很好的图书馆
$api->get("/test", function () {
Class KeyCluster extends Predis\Connection\PredisCluster {
public function __construct() {
$this->pool = Array();
}
public function add (Predis\Connection\SingleConnectionInterface $connection) {
$parameters = $connection->getParameters();
if (isset($parameters->table)) {
$this->pool[$parameters->table] = $connection;
} else {
$this->pool[] = $connection;
}
}
public function getConnection (Command\CommandInterface $command) {
$key = $command->getArgument(0);
$table = explode(":", $key)[0];
return isset($this->pool[$table]) ? $this->pool[$table] : null;
}
}
$redis = new Predis\Client([
"tcp://127.0.0.1:6382?table=dim_provider",
"tcp://127.0.0.1:6383?table=dim_pos"
],[
"cluster" => new KeyCluster
]);
$result = $redis->scard("dim_provider");
print_r($result);
});
谢谢显然我误解了alias sharding。我的目标是在一个单独的碎片上托管每个维度。假设我有一个名为
dim\u provider
的集合,加上名为dim\u provider:id
的散列,API将连接到redis群集,并根据需要的密钥知道要转到哪个服务器。我是否需要编写自己的分销策略?在我的PHP脚本中映射key:port对可能会更容易。通常在使用客户端分片时,您不关心存储在哪个服务器密钥中,理想情况下,密钥空间均匀分布在您的Redis实例中。您确实可以通过分配权重
参数来平衡每台服务器上的负载,或者通过只计算{}
中包装的密钥部分的哈希值,使用密钥标记来确保某些密钥组存储在同一个切分上,但是,您将无法基于密钥强制执行目标服务器。从某种意义上说,您的用例可以被视为一种非常专门的分区,但它不能很好地使用客户端分片来分发密钥的常用策略。考虑到您试图实现的目标,我只使用多个Predis\Client
实例,每个服务器一个,但是,通过实现Predis\Connection\ClusterConnectionInterface
来分析每个Redis命令的密钥,以决定应该使用哪个服务器,没有什么可以阻止您编写自己的集群后端类。定制毕竟是Predis的卖点之一。同意,再次感谢您的澄清和这个很棒的库。谢谢。显然我误解了alias sharding。我的目标是在一个单独的碎片上托管每个维度。假设我有一个名为dim\u provider
的集合,加上名为dim\u provider:id
的散列,API将连接到redis群集,并根据需要的密钥知道要转到哪个服务器。我是否需要编写自己的分销策略?在我的PHP脚本中映射key:port对可能会更容易。通常在使用客户端分片时,您不关心存储在哪个服务器密钥中,理想情况下,密钥空间均匀分布在您的Redis实例中。您确实可以通过分配权重
参数来平衡每台服务器上的负载,或者通过只计算{}
中包装的密钥部分的哈希值,使用密钥标记来确保某些密钥组存储在同一个切分上,但是,您将无法基于密钥强制执行目标服务器。从某种意义上说,您的用例可以被视为一种非常专门的分区,但它不能很好地使用客户端分片来分发密钥的常用策略。考虑到您试图实现的目标,我只使用多个Predis\Client
实例,每个服务器一个,但是,通过实现Predis\Connection\ClusterConnectionInterface
来分析每个Redis命令的密钥,以决定应该使用哪个服务器,没有什么可以阻止您编写自己的集群后端类。定制毕竟是Predis的卖点之一。同意,再次感谢你的澄清和这个很棒的库。你的方法基本上和我想的一样,但我的建议是,您应该通过实现Predis\Connection\ClusterConnectionInterface
而不是扩展Predis\Connection\PredisCluster
来创建集群类。对于您的类,只从Predis\Connection\PredisCluster
复制代码的相关部分是可以的,只是父类中有很多东西是您不需要的,或者在您的情况下根本没有意义。事实上,您最终会编写更多的代码,但这是为了获得更干净的解决方案而只编写一次的代码。这实际上就是我最终所做的。那里