PHP Conference Japan 2024

Memcached::getServerByKey

(PECL memcached >= 0.1.0)

Memcached::getServerByKey将键映射到服务器

描述

public Memcached::getServerByKey(string $server_key): array|false

Memcached::getServerByKey() 返回将在所有 Memcached::*ByKey() 操作中由特定 server_key 选择的服务器。

参数

server_key

用于标识要在其上存储或从中检索值的服务器的键。在决定与哪个 memcached 服务器通信时,我们不是对项目的实际键进行哈希,而是对服务器键进行哈希。这允许将相关项目分组到单个服务器上,以提高多操作的效率。

返回值

如果成功,则返回一个包含三个键的数组:hostportweight;如果失败,则返回 false。如有必要,请使用 Memcached::getResultCode()

示例

示例 #1 Memcached::getServerByKey() 示例

<?php
$m
= new Memcached();
$m->addServers(array(
array(
'mem1.domain.com', 11211, 40),
array(
'mem2.domain.com', 11211, 40),
array(
'mem3.domain.com', 11211, 20),
));

$m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);

var_dump($m->getServerByKey('user'));
var_dump($m->getServerByKey('log'));
var_dump($m->getServerByKey('ip'));
?>

以上示例将输出类似以下内容

array(3) {
  ["host"]=>
  string(15) "mem3.domain.com"
  ["port"]=>
  int(11211)
  ["weight"]=>
  int(20)
}
array(3) {
  ["host"]=>
  string(15) "mem2.domain.com"
  ["port"]=>
  int(11211)
  ["weight"]=>
  int(40)
}
array(3) {
  ["host"]=>
  string(15) "mem2.domain.com"
  ["port"]=>
  int(11211)
  ["weight"]=>
  int(40)
}

添加注释

用户贡献的注释 2 条注释

zhaoyong dot lc at gmail dot com
11 年前
参数 server_key 非常令人困惑,它不是 MemCached 服务器的服务器键,而是您存储在服务器中的键值对中的键。

<?php
$m
= new Memcached;
$m->addServers(array(
array(
'127.0.0.1',11212),
array(
'127.0.0.1',11211)
));
for(
$i=0;$i<10;$i++){
$key = 'key_'.$i;
$m->add($key, 1);
}
for(
$i=0;$i<10;$i++) {
$key = 'key_'.$i;
$arr = $m->getServerByKey($key);
echo (
$key.":\t".$arr['port']."\n");
}
?>

key_0: 11212
key_1: 11211
key_2: 11212
key_3: 11212
key_4: 11212
key_5: 11211
key_6: 11211
key_7: 11212
key_8: 11212
key_9: 11211
morphles
8 年前
为了澄清(即使是 C 库的 memcached 文档,坦率地说也很缺乏),$server_key 使用与值的常规键相同的方法进行哈希(我检查了 C 源代码,因为文档……)。因此,您可以通过使用与相同键的 getServerByKey($key) 来查看 set($key, $value) 去了哪里。如果一个人不想费心使用/不需要使用 *ByKey 函数,但仍然想知道常规键应该使用哪些服务器,以实现回退或错误报告,这将非常有用。
To Top