使用PHP怎么封装一个一致性散列分布式算法

  介绍

使用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怎么封装一个一致性散列分布式算法