1

我正在尝试通过别名使用 Predis 分片,如此处所述。我的代码基本相同,但我只返回空数组。我的哈希键周围需要 {} 吗?(编辑:不,刚刚尝试过)

  $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我可以看到它正在返回别名。

4

2 回答 2

1

为 Redis 连接分配dim_provider 别名和尝试从服务器获取命名密钥dim_provider是两件不同的事情。

在您的脚本中,您尝试使用连接别名(而不是通常的对)设置 Redis 实例集群,以计算您的密钥空间在充当数据分片ip:port的多个 Redis 服务器之间的分布。使用此设置,密钥会根据底层分布算法进行分片,并且可以存储在组成集群的 6 台服务器中的任何一台上,并在阵列中定义。dim_provider$servers

于 2013-03-02T13:31:59.440 回答
0

我想补充一下,一旦 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);
  });
于 2013-03-05T16:11:45.107 回答