2024 PHP Conference Japan

Memcached::getServerByKey

(PECL memcached >= 0.1.0)

Memcached::getServerByKey將鍵值映射到伺服器

說明

public Memcached::getServerByKey(字串 $server_key): 陣列|false

Memcached::getServerByKey() 會傳回在所有 Memcached::*ByKey() 操作中,會被特定 server_key 選擇的伺服器。

參數

server_key

用於識別儲存或擷取值的伺服器的鍵值。在決定要與哪個 memcached 伺服器通話時,我們不是對項目的實際鍵值進行雜湊,而是對伺服器鍵值進行雜湊。這允許相關項目被分組在單個伺服器上,以提高多操作的效率。

回傳值

成功時返回一個包含 `host`、`port` 和 `weight` 三個鍵值的陣列,失敗時返回 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 則註記

5
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
1
morphles
8 年前
只是為了澄清一下(坦白說,memcached 的文件,即使是 C 函式庫的文件,也相當缺乏),$server_key 使用與值的一般鍵相同的方法進行雜湊(我檢查了 C 原始碼,因為文件再次......)。因此,您應該能夠透過使用具有相同鍵的 getServerByKey($key) 來查看 set($key, $value) 的去向。如果不想費心使用/*ByKey 函式,或者不需要使用 *ByKey 函式,但仍然想知道哪些伺服器正在/應該與一般鍵使用,以便實作備援或錯誤報告,那麼這會很有用。
To Top