我正在尝试使用别名的Predis分片,作为described here。我的代码基本上是相同的,但我只返回空数组。我的哈希键是否需要{}包围?(编辑:没有,刚试过)
$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中的返回值前面抛出一些回显时,我可以看到它正在返回别名。
发布于 2013-03-02 21:31:59
为Redis连接分配一个dim_provider 别名和尝试从服务器获取一个名为dim_provider的密钥是两件不同的事情。
在您的脚本中,您尝试使用连接别名(而不是通常的ip:port对)设置一个Redis实例集群,以计算您的密钥空间在充当您的data shards的多个Redis服务器之间的分布。使用此设置,密钥dim_provider将根据底层分发算法进行分片,并且可以存储在组成集群的6台服务器中的任何一台服务器上,并在$servers数组中定义。
发布于 2013-03-06 00:11:45
我想补充的是,一旦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);
});https://stackoverflow.com/questions/15166613
复制相似问题