Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 预失真别名切分_Php_Redis_Predis - Fatal编程技术网

Php 预失真别名切分

Php 预失真别名切分,php,redis,predis,Php,Redis,Predis,我正在尝试使用Predis按别名进行切分,如图所示。我的代码基本相同,但我只返回空数组。我的散列键周围需要{}吗?(编辑:没有,只是试了一下) 编辑:如果我只在$servers数组中放置一台服务器,它也可以工作。因此,散列似乎无法正常工作。当我在nodehash中的返回值前面抛出一些回声时,我可以看到它正在返回别名。将dim\u提供程序别名分配给Redis连接和尝试从服务器获取名为dim\u提供程序的键是两件不同的事情 在您的脚本中,您试图使用连接别名(而不是通常的ip:port对)来设置一个R

我正在尝试使用Predis按别名进行切分,如图所示。我的代码基本相同,但我只返回空数组。我的散列键周围需要{}吗?(编辑:没有,只是试了一下)


编辑:如果我只在
$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
复制代码的相关部分是可以的,只是父类中有很多东西是您不需要的,或者在您的情况下根本没有意义。事实上,您最终会编写更多的代码,但这是为了获得更干净的解决方案而只编写一次的代码。这实际上就是我最终所做的。那里