我是借助一个三方库实现的 有时间再详细挖一挖这个库的源码
composer require flexihash/flexihash
$hash = new Flexihash();
// 添加节点
add$hash->addTargets(['cache-1', 'cache-2', 'cache-3']);
// 装填数据
$hash->lookup('object-a');
// 修改节点
$hash->addTarget('cache-4')
->removeTarget('cache-1');
// 获取节点数据
$hash->getAll();
// 获取数据节点
$hash->lookupList('object', 1);
array(2) {
["targers"]=>
array(10) {
[159095616]=>
string(17) "192.168.1.1:11011"
[2122099670]=>
string(17) "192.168.1.1:11011"
[576112771]=>
string(17) "192.168.1.1:11012"
[1431435285]=>
string(17) "192.168.1.1:11012"
[994965954]=>
string(17) "192.168.1.1:11013"
[1279969620]=>
string(17) "192.168.1.1:11013"
[1946971909]=>
string(17) "192.168.1.1:11014"
[51077011]=>
string(17) "192.168.1.1:11014"
[1830248004]=>
string(17) "192.168.1.1:11015"
[437284562]=>
string(17) "192.168.1.1:11015"
}
["positions"]=>
array(5) {
["192.168.1.1:11011"]=>
array(2) {
[0]=>
int(159095616)
[1]=>
int(2122099670)
}
["192.168.1.1:11012"]=>
array(2) {
[0]=>
int(576112771)
[1]=>
int(1431435285)
}
["192.168.1.1:11013"]=>
array(2) {
[0]=>
int(994965954)
[1]=>
int(1279969620)
}
["192.168.1.1:11014"]=>
array(2) {
[0]=>
int(1946971909)
[1]=>
int(51077011)
}
["192.168.1.1:11015"]=>
array(2) {
[0]=>
int(1830248004)
[1]=>
int(437284562)
}
}
}
可以将 targers 排好序缓存进 apcu 中,使用二分查找快速获取数据的节点信息。