1

here で説明されているように、エイリアスによる 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配列にサーバーを1つだけ配置した場合にも機能します。そのため、ハッシュが正しく機能していないようです。戻り値の前にいくつかのエコーをスローするとnodehash、エイリアスが返されていることがわかります。

4

2 に答える 2

1

Redis 接続にdim_provider エイリアスを割り当てることと、サーバーから名前が付けられたキーdim_providerを取得しようとすることは、2 つの異なることです。

スクリプトでは、(通常のペアではなく) 接続エイリアスを使用して 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 に答える