首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Predis Alias分片

Predis Alias分片
EN

Stack Overflow用户
提问于 2013-03-02 04:47:31
回答 2查看 926关注 0票数 1

我正在尝试使用别名的Predis分片,作为described here。我的代码基本上是相同的,但我只返回空数组。我的哈希键是否需要{}包围?(编辑:没有,刚试过)

代码语言:javascript
复制
  $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中的返回值前面抛出一些回显时,我可以看到它正在返回别名。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-02 21:31:59

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-06 00:11:45

我想补充的是,一旦nrk让我走上了正确的道路,实现我的集群策略是多么容易。这是一个写得很好的库。

代码语言:javascript
复制
 $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);
  });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15166613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档