国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP實現的服務器一致性hash分布算法示例

2024-05-05 00:04:56
字體:
來源:轉載
供稿:網友

本文實例講述了PHP實現的服務器一致性hash分布算法。分享給大家供大家參考,具體如下:

<?php/** * 對服務器進行一致性hash分布算法 */class HashRing{  private $servers = array();  private $nodeList = array();  private $nodeHashList = array();  private $nodeTotalNum = 0;  private $virtualNodeNum = 32;  private $keyHash = '';  public function __construct($servers)  {    $this->servers = $servers;    foreach ($servers as $server) {      for ($i = 0; $i < $this->virtualNodeNum; $i++) {        $this->nodeList[sprintf("%u", crc32($server.'-'.$i))] = array($server, $i);      }    }    ksort($this->nodeList);    $this->nodeHashList = array_keys($this->nodeList);  }  private function getNodeIndex($key)  {    $this->keyHash = sprintf("%u", crc32($key));    if ($this->keyHash > end($this->nodeHashList)) {      $this->keyHash = $this->keyHash % end($this->nodeHashList);    }    if ($this->keyHash <= reset($this->nodeHashList)) {      return 0;    }    $this->nodeTotalNum = count($this->nodeHashList);    return $this->binaryChopIndex(0, $this->nodeTotalNum);  }  private function binaryChopIndex($l=0, $r=0)  {    if ($l < $r) {      $avg = intval(($l+$r) / 2);      if ($this->nodeHashList[$avg] == $this->keyHash) {        return $avg;      } elseif ($this->keyHash < $this->nodeHashList[$avg] && ($avg > 0)) {        return $this->binaryChopIndex($l, $avg-1);      } else {        return $this->binaryChopIndex($avg+1, $r);      }    } else {      return $l;    }  }  public function getServersByKey($key, $num=1)  {    $index = $this->getNodeIndex($key);    $server = $this->nodeList[$this->nodeHashList[$index]];    if ($num == 1) {      return $server[0];    }    if ($num >= count($this->servers)) {      $num = count($this->servers);    }    $result = array($server[0]);    for ($i=$index+1; true; $i++) {      if ($i >= $this->nodeTotalNum) {        $i = 0;      }      $nextServer = $this->nodeList[$this->nodeHashList[$i]];      if (!in_array($nextServer[0], $result)) {        $result[] = $nextServer[0];      }      if (count($result) == $num) {        break;      }    }    return $result;  }}//示例$servers = array(  '127.0.0.1:11211',  '127.0.0.1:11212',  '127.0.0.1:11213',  '127.0.0.1:11214',  '127.0.0.1:11215');$obj = new HashRing($servers);$servers = $obj->getServersByKey('testkey', 2);print_r($servers);echo "/n";

運行結果:

Array
(
    [0] => 127.0.0.1:11214
    [1] => 127.0.0.1:11211
)

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 增城市| 阿拉善右旗| 徐闻县| 贵港市| 柳州市| 崇文区| 云梦县| 黔东| 盱眙县| 绥棱县| 庆元县| 平江县| 张家口市| 容城县| 平安县| 栖霞市| 榆社县| 内江市| 湖州市| 北碚区| 乐山市| 嵊泗县| 桂阳县| 乐都县| 自贡市| 都昌县| 神木县| 宕昌县| 溧阳市| 通渭县| 天全县| 汝城县| 丰镇市| 云霄县| 苍梧县| 贵定县| 屏东县| 盐津县| 威海市| 鄂托克旗| 桂阳县|