介绍
使用PHP怎么封装一个一致性散列分布式算法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>一、无虚拟节点实现强>
& lt; PHP ?/* * ,*一致性散列分布式算法 ,* @param 关键美元 ,* @return int ,*实现步骤 ,* 1。先将0 ~,是32位最大带符号整数(0 x7fffffff),想象成一个闭环 *大敌;2。将服务器列表通过哈希算法分布在,圆环之中 *大敌;3。将键值也分布在圆环之中 *大敌;4。通过_isSorted判断服务器是否需要进行倒序排序,排序后遍历服务器,找到最近的服务器,返回 ,*哈希算法是不保证平衡的,为了尽量保证平衡性,我们应该加入虚拟节点数,将一个服务器节点虚拟化成为多个,较大程度上保证了平衡性 ,*/class FlexiHash { private 才能;_serverList 美元;=,数组(); private 才能;_isSorted 美元;=,假; private 才能;_virtual_node_num 美元;=,20;//虚拟节点数,服务器越少,增加的虚拟节点数应该越多//才能通过哈希算法返回一个整数的值 protected 才能;function  myHash(键){ ,,,md5 美元;=,substr (md5(键)美元0 8); ,,,seed 美元;=,31日,,//种子值 ,,,哈希美元=0; ,,,(i=0; i<美元;8美元我+ +){ ,,,,,hash 美元;=,散列*种子+奥德美元($ md5 {$ i});,//ord 返回ascii值 ,,,,,我+ +美元; ,,,} ,,,return hash&美元;0 x7fffffff;,//0 x7fffffff表示最大值 ,,}//才能添加服务器 function 才能addServer(服务器){ ,,,hash 美元;=$这→myHash(美元服务器只& # 39;# 1 & # 39;); ,,,如果(!收取($ this→_serverList[$散列])),{ ,,,,,for ($小姐:=1;祝福;美元小姐:& lt;=, $ this→_virtual_node_num;,我+ +美元),{ ,,,,,,,hash 美元;=,$ this→myHash (server 美元;只& # 39;# & # 39;,只我美元); ,,,,,,,这个→美元_serverList(散列美元),=,美元服务器; ,,,,,} ,,,} ,,,这个→美元_isSorted =,假; ,,,return 真实; ,,}//才能删除服务器 function 才能removeServer(服务器){ ,,,for ($小姐:=1;祝福;美元小姐:& lt;=, $ this→_virtual_node_num;,我+ +美元),{ ,,,,,hash 美元;=,$ this→myHash (server 美元;只& # 39;# & # 39;,只我美元); ,,,,,设置($ this→_serverList[$散列]); ,,,} ,,,这个→美元_isSorted =,假; ,,,return 真实; ,,}//才能获取服务器 function 才能查找(键){ ,,,hash 美元;=$这→myHash(关键); ,,,如果(! $ this→_isSorted) { ,,,,,作用(这比美元;_serverList SORT_NUMERIC); ,,,,,这个→美元_isSorted =,真的; ,,,} ,,,foreach ($ this→_serverList as $ pos=祝辞美元服务器){ ,,,,,如果(hash 美元;祝辞=,pos美元),return 美元服务器; ,,,} ,,,return 结束($ this→_serverList); ,,} public 才能;function  getServerList () { 作用,,,:$ this→_serverList, SORT_NUMERIC); ,,,return $ this→_serverList; ,,} }//demo 测试 $ hserver =, new FlexiHash ();//添加服务器 美元hserver→addServer (& # 39; 192.168.1.1 # 39;); 美元hserver→addServer (& # 39; 192.168.1.2& # 39;); 美元hserver→addServer (& # 39; 192.168.1.3 # 39;); 美元hserver→addServer (& # 39; 192.168.1.4& # 39;); 美元hserver→addServer (& # 39; 192.168.1.5& # 39;); $ key1=& # 39; Key1111& # 39;; $ key2=& # 39; Key2222& # 39;; $ key2=& # 39; Key3333& # 39;; $ key2=& # 39; Key4444& # 39;; $ key2=& # 39; Key5555& # 39;; $ key2=& # 39; Key6666& # 39;; ,echo “节省key1 服务器:,“拷贝。美元hserver→查找(key1美元).PHP_EOL; ,echo “节省key2 服务器:,“拷贝。美元hserver→查找(key2美元).PHP_EOL; ,echo “节省key1 服务器:,“拷贝。美元hserver→查找(key3美元).PHP_EOL; ,echo “节省key2 服务器:,“拷贝。美元hserver→查找(key4美元).PHP_EOL; ,echo “节省key1 服务器:,“拷贝。美元hserver→查找(key5美元).PHP_EOL; ,echo “节省key2 服务器:,“拷贝。美元hserver→查找(key6美元).PHP_EOL; echo “================================================?PHP_EOL;//移除服务器,键值将自动转义到下一台服务器 美元hserver→removeServer (& # 39; 192.168.1.4& # 39;); ,echo “节省key1 服务器:,“拷贝。美元hserver→查找(key1美元).PHP_EOL; ,echo “节省key2 服务器:,“拷贝。美元hserver→查找(key2美元).PHP_EOL; ,echo “节省key1 服务器:,“拷贝。美元hserver→查找(key3美元).PHP_EOL; null null null null null null null null null null null null使用PHP怎么封装一个一致性散列分布式算法