• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP一致性hash分布式算法封装类定义与用法示例

    本文实例讲述了PHP一致性hash分布式算法封装类定义与用法。分享给大家供大家参考,具体如下:

    一、无虚拟节点实现

    ?php
    /**
     * 一致性hash分布式算法
     * @param $key
     * @return int
     * 实现步骤
     * 1.先将0~ 是32位最大带符号整数(0x7FFFFFFF) 想象成一个闭环
     * 2.将服务器列表通过hash算法分布在 圆环之中
     * 3.将key值也分布在圆环之中
     * 4.通过_isSorted判断服务器是否需要进行倒序排序 排序后遍历服务器 找到最近的服务器 返回
     * hash算法是不保证平衡的 为了尽量保证平衡性 我们应该加入虚拟节点数 将一个服务器节点虚拟化成为多个 较大程度上保证了平衡性
     */
    class FlexiHash{
      private $_serverList = array();
      private $_isSorted = false;
      private $_virtual_node_num = 20;//虚拟节点数 服务器越少 增加的虚拟节点数应该越多
      //通过hash算法返回一个整数值
      protected function myHash($key){
        $md5 = substr(md5($key),0,8);
        $seed = 31; //种子值
        $hash=0;
        for($i=0;$i8;$i++){
          $hash = $hash*$seed+ord($md5{$i}); //ord 返回ascii值
          $i++;
        }
        return $hash0x7FFFFFFF; //0x7FFFFFFF表示最大值
      }
      //添加服务器
      function addServer($server){
        $hash =$this->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;
        return true;
      }
      //删除服务器
      function removeServer($server){
        for ($i = 1; $i = $this->_virtual_node_num; $i++) {
          $hash = $this->myHash($server . '#' . $i);
          unset($this->_serverList[$hash]);
        }
        $this->_isSorted = false;
        return true;
      }
      //获取服务器
      function lookup($key){
        $hash =$this->myHash($key);
        if(!$this->_isSorted){
          krsort($this->_serverList,SORT_NUMERIC);
          $this->_isSorted = true;
        }
        foreach($this->_serverList as $pos=>$server){
          if($hash >= $pos) return $server;
        }
        return end($this->_serverList);
      }
      public function getServerList(){
        krsort($this->_serverList,SORT_NUMERIC);
        return $this->_serverList;
      }
    }
    //demo test
    $hserver = new FlexiHash();
    //添加服务器
    $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 "save key1 in server: ".$hserver->lookup($key1).PHP_EOL;
    echo "save key2 in server: ".$hserver->lookup($key2).PHP_EOL;
    echo "save key1 in server: ".$hserver->lookup($key3).PHP_EOL;
    echo "save key2 in server: ".$hserver->lookup($key4).PHP_EOL;
    echo "save key1 in server: ".$hserver->lookup($key5).PHP_EOL;
    echo "save key2 in server: ".$hserver->lookup($key6).PHP_EOL;
    echo "================================================".PHP_EOL;
    //移除服务器 key值将自动转义到下一台服务器
    $hserver->removeServer('192.168.1.4');
    echo "save key1 in server: ".$hserver->lookup($key1).PHP_EOL;
    echo "save key2 in server: ".$hserver->lookup($key2).PHP_EOL;
    echo "save key1 in server: ".$hserver->lookup($key3).PHP_EOL;
    echo "save key2 in server: ".$hserver->lookup($key4).PHP_EOL;
    echo "save key1 in server: ".$hserver->lookup($key5).PHP_EOL;
    echo "save key2 in server: ".$hserver->lookup($key6).PHP_EOL;
    echo "================================================".PHP_EOL;
    //恢复故障服务器 key值将恢复原来服务器
    $hserver->addServer('192.168.1.4');
    echo "save key1 in server: ".$hserver->lookup($key1).PHP_EOL;
    echo "save key2 in server: ".$hserver->lookup($key2).PHP_EOL;
    echo "save key1 in server: ".$hserver->lookup($key3).PHP_EOL;
    echo "save key2 in server: ".$hserver->lookup($key4).PHP_EOL;
    echo "save key1 in server: ".$hserver->lookup($key5).PHP_EOL;
    echo "save key2 in server: ".$hserver->lookup($key6).PHP_EOL;
    
    

    二、运行结果:

    save key1 in server: 192.168.1.4
    save key2 in server: 192.168.1.4
    save key1 in server: 192.168.1.3
    save key2 in server: 192.168.1.3
    save key1 in server: 192.168.1.3
    save key2 in server: 192.168.1.3
    ================================================
    save key1 in server: 192.168.1.2
    save key2 in server: 192.168.1.5
    save key1 in server: 192.168.1.3
    save key2 in server: 192.168.1.3
    save key1 in server: 192.168.1.3
    save key2 in server: 192.168.1.3
    ================================================
    save key1 in server: 192.168.1.4
    save key2 in server: 192.168.1.4
    save key1 in server: 192.168.1.3
    save key2 in server: 192.168.1.3
    save key1 in server: 192.168.1.3
    save key2 in server: 192.168.1.3

    PS:这里再为大家提供2款hash相关在线工具供大家参考使用:

    在线散列/哈希算法加密工具:
    http://tools.jb51.net/password/hash_encrypt

    在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
    http://tools.jb51.net/password/hash_md5_sha

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《php加密方法总结》、《PHP编码与转码操作技巧汇总》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》及《php正则表达式用法总结》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • 标准PHP的AES加密算法类
    • php 地区分类排序算法
    • PHP对称加密算法(DES/AES)类的实现代码
    • PHP实现的各类hash算法长度及性能测试实例
    • PHP排序算法类实例
    • PHP经典算法集锦【经典收藏】
    • php加密算法之实现可逆加密算法和解密分享
    • PHP面试常用算法(推荐)
    • PHP mcrypt可逆加密算法分析
    • PHP实现的ID混淆算法类与用法示例
    上一篇:PHP实现的函数重载功能示例
    下一篇:PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP一致性hash分布式算法封装类定义与用法示例 PHP,一致性,hash,分布式,算法,