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相关在线工具供大家参考使用:
在线散列/