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

首頁 > 語言 > PHP > 正文

PHP一致性hash分布式算法封裝類定義與用法示例

2024-05-05 00:04:50
字體:
供稿:網(wǎng)友

本文實(shí)例講述了PHP一致性hash分布式算法封裝類定義與用法。分享給大家供大家參考,具體如下:

一、無虛擬節(jié)點(diǎn)實(shí)現(xiàn)

<?php/** * 一致性hash分布式算法 * @param $key * @return int * 實(shí)現(xiàn)步驟 * 1.先將0~ 是32位最大帶符號整數(shù)(0x7FFFFFFF) 想象成一個閉環(huán) * 2.將服務(wù)器列表通過hash算法分布在 圓環(huán)之中 * 3.將key值也分布在圓環(huán)之中 * 4.通過_isSorted判斷服務(wù)器是否需要進(jìn)行倒序排序 排序后遍歷服務(wù)器 找到最近的服務(wù)器 返回 * hash算法是不保證平衡的 為了盡量保證平衡性 我們應(yīng)該加入虛擬節(jié)點(diǎn)數(shù) 將一個服務(wù)器節(jié)點(diǎn)虛擬化成為多個 較大程度上保證了平衡性 */class FlexiHash{  private $_serverList = array();  private $_isSorted = false;  private $_virtual_node_num = 20;//虛擬節(jié)點(diǎn)數(shù) 服務(wù)器越少 增加的虛擬節(jié)點(diǎn)數(shù)應(yīng)該越多  //通過hash算法返回一個整數(shù)值  protected function myHash($key){    $md5 = substr(md5($key),0,8);    $seed = 31; //種子值    $hash=0;    for($i=0;$i<8;$i++){      $hash = $hash*$seed+ord($md5{$i}); //ord 返回ascii值      $i++;    }    return $hash&0x7FFFFFFF; //0x7FFFFFFF表示最大值  }  //添加服務(wù)器  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;  }  //刪除服務(wù)器  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;  }  //獲取服務(wù)器  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();//添加服務(wù)器$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;//移除服務(wù)器 key值將自動轉(zhuǎn)義到下一臺服務(wù)器$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;//恢復(fù)故障服務(wù)器 key值將恢復(fù)原來服務(wù)器$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;

二、運(yùn)行結(jié)果:

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

希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。


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

圖片精選

主站蜘蛛池模板: 河南省| 德清县| 中卫市| 诸城市| 苍山县| 上栗县| 太湖县| 山东| 罗源县| 区。| 通渭县| 青海省| 杭锦旗| 高青县| 阳原县| 绵竹市| 巴楚县| 邵东县| 依安县| 海兴县| 兴文县| 读书| 古蔺县| 灵台县| 靖远县| 新安县| 大关县| 寻甸| 海宁市| 襄樊市| 惠水县| 原平市| 栾川县| 永登县| 盐边县| 健康| 安国市| 陇南市| 通化市| 习水县| 绿春县|