PHP一致性hash分布式算法封装类定义与用法示例
本文实例讲述了PHP一致性hash分布式算法封装类定义与用法。分享给大家供大家参考,具体如下:
一、无虚拟节点实现
myHash($server.'#1');
if(!isset($this->_serverList[$hash])){
for($i=1;$i<=$this->_virtual_node_num;$i++){
$hash=$this->myHash($server.'#'.$i);
$this->_serverList[$hash]=$server;
}
}
$this->_isSorted=false;
returntrue;
}
//删除服务器
functionremoveServer($server){
for($i=1;$i<=$this->_virtual_node_num;$i++){
$hash=$this->myHash($server.'#'.$i);
unset($this->_serverList[$hash]);
}
$this->_isSorted=false;
returntrue;
}
//获取服务器
functionlookup($key){
$hash=$this->myHash($key);
if(!$this->_isSorted){
krsort($this->_serverList,SORT_NUMERIC);
$this->_isSorted=true;
}
foreach($this->_serverListas$pos=>$server){
if($hash>=$pos)return$server;
}
returnend($this->_serverList);
}
publicfunctiongetServerList(){
krsort($this->_serverList,SORT_NUMERIC);
return$this->_serverList;
}
}
//demotest
$hserver=newFlexiHash();
//添加服务器
$hserver->addServer('192.168.1.1');
$hserver->addServer('192.168.1.2');
$hserver->addServer('192.168.1.3');
$hserver->addServer('192.168.1.4');
$hserver->addServer('192.168.1.5');
$key1='Key1111';
$key2='Key2222';
$key2='Key3333';
$key2='Key4444';
$key2='Key5555';
$key2='Key6666';
echo"savekey1inserver:".$hserver->lookup($key1).PHP_EOL;
echo"savekey2inserver:".$hserver->lookup($key2).PHP_EOL;
echo"savekey1inserver:".$hserver->lookup($key3).PHP_EOL;
echo"savekey2inserver:".$hserver->lookup($key4).PHP_EOL;
echo"savekey1inserver:".$hserver->lookup($key5).PHP_EOL;
echo"savekey2inserver:".$hserver->lookup($key6).PHP_EOL;
echo"================================================".PHP_EOL;
//移除服务器key值将自动转义到下一台服务器
$hserver->removeServer('192.168.1.4');
echo"savekey1inserver:".$hserver->lookup($key1).PHP_EOL;
echo"savekey2inserver:".$hserver->lookup($key2).PHP_EOL;
echo"savekey1inserver:".$hserver->lookup($key3).PHP_EOL;
echo"savekey2inserver:".$hserver->lookup($key4).PHP_EOL;
echo"savekey1inserver:".$hserver->lookup($key5).PHP_EOL;
echo"savekey2inserver:".$hserver->lookup($key6).PHP_EOL;
echo"================================================".PHP_EOL;
//恢复故障服务器key值将恢复原来服务器
$hserver->addServer('192.168.1.4');
echo"savekey1inserver:".$hserver->lookup($key1).PHP_EOL;
echo"savekey2inserver:".$hserver->lookup($key2).PHP_EOL;
echo"savekey1inserver:".$hserver->lookup($key3).PHP_EOL;
echo"savekey2inserver:".$hserver->lookup($key4).PHP_EOL;
echo"savekey1inserver:".$hserver->lookup($key5).PHP_EOL;
echo"savekey2inserver:".$hserver->lookup($key6).PHP_EOL;
二、运行结果:
savekey1inserver:192.168.1.4
savekey2inserver:192.168.1.4
savekey1inserver:192.168.1.3
savekey2inserver:192.168.1.3
savekey1inserver:192.168.1.3
savekey2inserver:192.168.1.3
================================================
savekey1inserver:192.168.1.2
savekey2inserver:192.168.1.5
savekey1inserver:192.168.1.3
savekey2inserver:192.168.1.3
savekey1inserver:192.168.1.3
savekey2inserver:192.168.1.3
================================================
savekey1inserver:192.168.1.4
savekey2inserver:192.168.1.4
savekey1inserver:192.168.1.3
savekey2inserver:192.168.1.3
savekey1inserver:192.168.1.3
savekey2inserver:192.168.1.3
PS:这里再为大家提供2款hash相关在线工具供大家参考使用:
在线散列/