婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP實現的一致性Hash算法詳解【分布式算法】

PHP實現的一致性Hash算法詳解【分布式算法】

熱門標簽:寧波外呼營銷系統 福建銀行智能外呼系統價格 上海做外呼線路的通信公司 四川保險智能外呼系統供應商 遼寧ai電銷機器人價格 房產中介用的是什么外呼系統 電話機器人銷售主要負責什么 地圖標注專員怎么樣 長沙做地圖標注公司

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

一致性哈希算法是分布式系統中常用的算法,為什么要用這個算法?

比如:一個分布式存儲系統,要將數據存儲到具體的節點(服務器)上, 在服務器數量不發生改變的情況下,如果采用普通的hash再對服務器總數量取模的方法(如key%服務器總數量),如果期間有服務器宕機了或者需要增加服務器,問題就出來了。 同一個key經過hash之后,再與服務器總數量取模的結果跟之前的結果會不一樣,這就導致了之前保存數據的丟失。因此,引入了一致性Hash(Consistent Hashing)分布算法

把數據用hash函數(如md5,sha1),映射到一個圓環上,如上圖所示,數據在存儲時,先根據hash算法算出key的hash值,對應到這個環中的位置,如k1對應圖中所示的位置同,然后沿著順時針方向找到服務器節點B,然后把k1在存到B這個節點中。

如果B節點宕機了,則B上的數據就會落到C節點上,如下圖所示

這樣,只會影響C節點,對于其他節點A、D的數據不會造成影響。但是問題來了,這樣會造成C節點負載過重的情況,因為C節點承擔了B節點的數據,所以C節點容易宕機,這樣造成了分布不均勻。

為了解決這個問題,引入了“虛擬節點“的概念:即想象空上環上有很多”虛擬節點“,一個真實的服務器節點對應多個虛擬節點,數據存儲的時候沿著環的順時針方向找到虛擬節點,就找到了對應的真實服務器節點。如下圖

圖中的A1、A2、B1、B2、C1、C2、D1、D2都是虛擬節點,機器A負載存儲A1、A2的數據,機器B負載存儲B1、B2的數據,機器C負載存儲C1、C2的數據。由于這些虛擬節點數量很多,均勻分布,因此不會造成“雪崩”現象。

一致性哈希算法的PHP實現

下面給出一個接口

/**
 * 一致性哈希實現接口
 * Interface ConsistentHash
 */
interface ConsistentHash
{
 //將字符串轉為hash值
 public function cHash($str);
 //添加一臺服務器到服務器列表中
 public function addServer($server);
 //從服務器刪除一臺服務器
 public function removeServer($server);
 //在當前的服務器列表中找到合適的服務器存放數據
 public function lookup($key);
}

這個接口分別定義了4個方法,cHash(將字符串處理為hash值)、addServer(增加一臺服務器)、removeServer(移除一臺服務器)、lookup(找到一臺服務器來存儲數據)

下面給出一個該接口的具體實現

/**
 * 具體一致性哈希實現
 * author chenqionghe
 * Class MyConsistentHash
 */
class MyConsistentHash implements ConsistentHash
{
 public $serverList = array(); //服務器列列表
 public $virtualPos = array(); //虛擬節點的位置
 public $virtualPosNum = 5;  //每個節點對應5個虛節點
 /**
  * 將字符串轉換成32位無符號整數hash值
  * @param $str
  * @return int
  */
 public function cHash($str)
 {
  $str = md5($str);
  return sprintf('%u', crc32($str));
 }
 /**
  * 在當前的服務器列表中找到合適的服務器存放數據
  * @param $key 鍵名
  * @return mixed 返回服務器IP地址
  */
 public function lookup($key)
 {
  $point = $this->cHash($key);//落點的hash值
  $finalServer = current($this->virtualPos);//先取圓環上最小的一個節點當成結果
  foreach($this->virtualPos as $pos=>$server)
  {
   if($point = $pos)
   {
    $finalServer = $server;
    break;
   }
  }
  reset($this->virtualPos);//重置圓環的指針為第一個
  return $finalServer;
 }
 /**
  * 添加一臺服務器到服務器列表中
  * @param $server 服務器IP地址
  * @return bool
  */
 public function addServer($server)
 {
  if(!isset($this->serverList[$server]))
  {
   for($i=0; $i$this->virtualPosNum; $i++)
   {
    $pos = $this->cHash($server . '-' . $i);
    $this->virtualPos[$pos] = $server;
    $this->serverList[$server][] = $pos;
   }
   ksort($this->virtualPos,SORT_NUMERIC);
  }
  return TRUE;
 }
 /**
  * 移除一臺服務器(循環所有的虛節點,刪除值為該服務器地址的虛節點)
  * @param $key
  * @return bool
  */
 public function removeServer($key)
 {
  if(isset($this->serverList[$key]))
  {
   //刪除對應虛節點
   foreach($this->serverList[$key] as $pos)
   {
    unset($this->virtualPos[$pos]);
   }
   //刪除對應服務器
   unset($this->serverList[$key]);
  }
  return TRUE;
 }
}

然后, 我們來測試一下該算法

$hashServer = new MyConsistentHash();
$hashServer->addServer('192.168.1.1');
$hashServer->addServer('192.168.1.2');
$hashServer->addServer('192.168.1.3');
$hashServer->addServer('192.168.1.4');
$hashServer->addServer('192.168.1.5');
$hashServer->addServer('192.168.1.6');
$hashServer->addServer('192.168.1.7');
$hashServer->addServer('192.168.1.8');
$hashServer->addServer('192.168.1.9');
$hashServer->addServer('192.168.1.10');
echo "增加十臺服務器192.168.1.1~192.168.1.10br />";
echo "保存 key1 到 server :".$hashServer->lookup('key1') . 'br />';
echo "保存 key2 到 server :".$hashServer->lookup('key2') . 'br />';
echo "保存 key3 到 server :".$hashServer->lookup('key3') . 'br />';
echo "保存 key4 到 server :".$hashServer->lookup('key4') . 'br />';
echo "保存 key5 到 server :".$hashServer->lookup('key5') . 'br />';
echo "保存 key6 到 server :".$hashServer->lookup('key6') . 'br />';
echo "保存 key7 到 server :".$hashServer->lookup('key7') . 'br />';
echo "保存 key8 到 server :".$hashServer->lookup('key8') . 'br />';
echo "保存 key9 到 server :".$hashServer->lookup('key9') . 'br />';
echo "保存 key10 到 server :".$hashServer->lookup('key10') . 'br />';
echo 'hr />';
echo "移除一臺服務器192.168.1.2br />";
$hashServer->removeServer('192.168.1.2');
echo "保存 key1 到 server :".$hashServer->lookup('key1') . 'br />';
echo "保存 key2 到 server :".$hashServer->lookup('key2') . 'br />';
echo "保存 key3 到 server :".$hashServer->lookup('key3') . 'br />';
echo "保存 key4 到 server :".$hashServer->lookup('key4') . 'br />';
echo "保存 key5 到 server :".$hashServer->lookup('key5') . 'br />';
echo "保存 key6 到 server :".$hashServer->lookup('key6') . 'br />';
echo "保存 key7 到 server :".$hashServer->lookup('key7') . 'br />';
echo "保存 key8 到 server :".$hashServer->lookup('key8') . 'br />';
echo "保存 key9 到 server :".$hashServer->lookup('key9') . 'br />';
echo "保存 key10 到 server :".$hashServer->lookup('key10') . 'br />';
echo 'hr />';
echo "移除一臺服務器192.168.1.6br />";
$hashServer->removeServer('192.168.1.6');
echo "保存 key1 到 server :".$hashServer->lookup('key1') . 'br />';
echo "保存 key2 到 server :".$hashServer->lookup('key2') . 'br />';
echo "保存 key3 到 server :".$hashServer->lookup('key3') . 'br />';
echo "保存 key4 到 server :".$hashServer->lookup('key4') . 'br />';
echo "保存 key5 到 server :".$hashServer->lookup('key5') . 'br />';
echo "保存 key6 到 server :".$hashServer->lookup('key6') . 'br />';
echo "保存 key7 到 server :".$hashServer->lookup('key7') . 'br />';
echo "保存 key8 到 server :".$hashServer->lookup('key8') . 'br />';
echo "保存 key9 到 server :".$hashServer->lookup('key9') . 'br />';
echo "保存 key10 到 server :".$hashServer->lookup('key10') . 'br />';
echo 'hr />';
echo "移除一臺服務器192.168.1.8br />";
$hashServer->removeServer('192.168.1.8');
echo "保存 key1 到 server :".$hashServer->lookup('key1') . 'br />';
echo "保存 key2 到 server :".$hashServer->lookup('key2') . 'br />';
echo "保存 key3 到 server :".$hashServer->lookup('key3') . 'br />';
echo "保存 key4 到 server :".$hashServer->lookup('key4') . 'br />';
echo "保存 key5 到 server :".$hashServer->lookup('key5') . 'br />';
echo "保存 key6 到 server :".$hashServer->lookup('key6') . 'br />';
echo "保存 key7 到 server :".$hashServer->lookup('key7') . 'br />';
echo "保存 key8 到 server :".$hashServer->lookup('key8') . 'br />';
echo "保存 key9 到 server :".$hashServer->lookup('key9') . 'br />';
echo "保存 key10 到 server :".$hashServer->lookup('key10') . 'br />';
echo 'hr />';
echo "移除一臺服務器192.168.1.2br />";
$hashServer->removeServer('192.168.1.2');
echo "保存 key1 到 server :".$hashServer->lookup('key1') . 'br />';
echo "保存 key2 到 server :".$hashServer->lookup('key2') . 'br />';
echo "保存 key3 到 server :".$hashServer->lookup('key3') . 'br />';
echo "保存 key4 到 server :".$hashServer->lookup('key4') . 'br />';
echo "保存 key5 到 server :".$hashServer->lookup('key5') . 'br />';
echo "保存 key6 到 server :".$hashServer->lookup('key6') . 'br />';
echo "保存 key7 到 server :".$hashServer->lookup('key7') . 'br />';
echo "保存 key8 到 server :".$hashServer->lookup('key8') . 'br />';
echo "保存 key9 到 server :".$hashServer->lookup('key9') . 'br />';
echo "保存 key10 到 server :".$hashServer->lookup('key10') . 'br />';
echo 'hr />';
echo "增加一臺服務器192.168.1.11br />";
$hashServer->addServer('192.168.1.11');
echo "保存 key1 到 server :".$hashServer->lookup('key1') . 'br />';
echo "保存 key2 到 server :".$hashServer->lookup('key2') . 'br />';
echo "保存 key3 到 server :".$hashServer->lookup('key3') . 'br />';
echo "保存 key4 到 server :".$hashServer->lookup('key4') . 'br />';
echo "保存 key5 到 server :".$hashServer->lookup('key5') . 'br />';
echo "保存 key6 到 server :".$hashServer->lookup('key6') . 'br />';
echo "保存 key7 到 server :".$hashServer->lookup('key7') . 'br />';
echo "保存 key8 到 server :".$hashServer->lookup('key8') . 'br />';
echo "保存 key9 到 server :".$hashServer->lookup('key9') . 'br />';
echo "保存 key10 到 server :".$hashServer->lookup('key10') . 'br />';
echo 'hr />';

運行結果如下

增加十臺服務器192.168.1.1~192.168.1.10
保存 key1 到 server :192.168.1.2
保存 key2 到 server :192.168.1.1
保存 key3 到 server :192.168.1.6
保存 key4 到 server :192.168.1.8
保存 key5 到 server :192.168.1.9
保存 key6 到 server :192.168.1.10
保存 key7 到 server :192.168.1.7
保存 key8 到 server :192.168.1.4
保存 key9 到 server :192.168.1.7
保存 key10 到 server :192.168.1.4
移除一臺服務器192.168.1.2
保存 key1 到 server :192.168.1.7
保存 key2 到 server :192.168.1.1
保存 key3 到 server :192.168.1.6
保存 key4 到 server :192.168.1.8
保存 key5 到 server :192.168.1.9
保存 key6 到 server :192.168.1.10
保存 key7 到 server :192.168.1.7
保存 key8 到 server :192.168.1.4
保存 key9 到 server :192.168.1.7
保存 key10 到 server :192.168.1.4
移除一臺服務器192.168.1.6
保存 key1 到 server :192.168.1.7
保存 key2 到 server :192.168.1.1
保存 key3 到 server :192.168.1.3
保存 key4 到 server :192.168.1.8
保存 key5 到 server :192.168.1.9
保存 key6 到 server :192.168.1.10
保存 key7 到 server :192.168.1.7
保存 key8 到 server :192.168.1.4
保存 key9 到 server :192.168.1.7
保存 key10 到 server :192.168.1.4
移除一臺服務器192.168.1.8
保存 key1 到 server :192.168.1.7
保存 key2 到 server :192.168.1.1
保存 key3 到 server :192.168.1.3
保存 key4 到 server :192.168.1.10
保存 key5 到 server :192.168.1.9
保存 key6 到 server :192.168.1.10
保存 key7 到 server :192.168.1.7
保存 key8 到 server :192.168.1.4
保存 key9 到 server :192.168.1.7
保存 key10 到 server :192.168.1.4
移除一臺服務器192.168.1.2
保存 key1 到 server :192.168.1.7
保存 key2 到 server :192.168.1.1
保存 key3 到 server :192.168.1.3
保存 key4 到 server :192.168.1.10
保存 key5 到 server :192.168.1.9
保存 key6 到 server :192.168.1.10
保存 key7 到 server :192.168.1.7
保存 key8 到 server :192.168.1.4
保存 key9 到 server :192.168.1.7
保存 key10 到 server :192.168.1.4
增加一臺服務器192.168.1.11
保存 key1 到 server :192.168.1.7
保存 key2 到 server :192.168.1.1
保存 key3 到 server :192.168.1.11
保存 key4 到 server :192.168.1.10
保存 key5 到 server :192.168.1.9
保存 key6 到 server :192.168.1.10
保存 key7 到 server :192.168.1.7
保存 key8 到 server :192.168.1.4
保存 key9 到 server :192.168.1.7
保存 key10 到 server :192.168.1.4

可以,看到,使用一致性哈希后,無認是增加服務器還是減少服務器都最大程度的保證了數據的完整性、均勻性.

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程序設計有所幫助。

您可能感興趣的文章:
  • Nginx 安裝筆記(含PHP支持、虛擬主機、反向代理負載均衡)
  • PHP開發負載均衡指南
  • PHP實現負載均衡下的session共用功能
  • PHP實現負載均衡session共享redis緩存操作示例
  • Thinkphp結合AJAX長輪詢實現PC與APP推送詳解
  • PHP經典算法集錦【經典收藏】
  • php 分庫分表hash算法
  • php的hash算法介紹
  • PHP中對各種加密算法、Hash算法的速度測試對比代碼
  • PHP實現負載均衡的加權輪詢方法分析

標簽:宿遷 延安 佛山 澳門 常德 宜春 深圳 工商登記

巨人網絡通訊聲明:本文標題《PHP實現的一致性Hash算法詳解【分布式算法】》,本文關鍵詞  PHP,實現,的,一致性,Hash,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP實現的一致性Hash算法詳解【分布式算法】》相關的同類信息!
  • 本頁收集關于PHP實現的一致性Hash算法詳解【分布式算法】的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    4438成人网| 国产欧美精品区一区二区三区| 91久久精品一区二区三| 久久久亚洲综合| 久久精品噜噜噜成人av农村| 欧美视频一区二区三区| 一区二区日韩电影| 在线视频一区二区免费| 亚洲免费观看高清完整版在线 | 久久不见久久见免费视频7| 在线观看网站黄不卡| 一区二区三区资源| 国产精品原创巨作av| 国产精品一色哟哟哟| 7777精品伊人久久久大香线蕉最新版 | 久久精品男人天堂av| 久久99蜜桃精品| 99v久久综合狠狠综合久久| 5566中文字幕一区二区电影| 亚洲综合精品久久| 99re这里都是精品| 5858s免费视频成人| 一区二区三区高清| 91麻豆文化传媒在线观看| 99re这里只有精品视频首页| 国产无遮挡一区二区三区毛片日本| 国产一区二区调教| 久久久久久**毛片大全| 狠狠色丁香久久婷婷综| 2021中文字幕一区亚洲| 不卡免费追剧大全电视剧网站| 2020国产精品自拍| 激情文学综合网| 国产日韩综合av| 午夜激情久久久| 精品粉嫩aⅴ一区二区三区四区| 国产日本欧洲亚洲| 91福利国产精品| 麻豆精品精品国产自在97香蕉| 国产亚洲一区二区三区在线观看 | 亚洲综合图片区| 日韩精品一区二区三区蜜臀| 91片在线免费观看| 蜜桃久久av一区| 亚洲欧美影音先锋| 欧美r级在线观看| 日本欧美久久久久免费播放网| 欧美一区二区在线免费观看| 亚洲成人7777| 欧美在线免费观看亚洲| 日韩一区二区三区三四区视频在线观看| 亚洲成人黄色小说| 国产精品久久久久永久免费观看 | 亚洲欧美一区二区三区久本道91| 337p亚洲精品色噜噜| 99久久久国产精品| 亚洲色图视频网站| 久久综合九色综合久久久精品综合 | 欧美夫妻性生活| 久久精品国产精品亚洲综合| 综合欧美一区二区三区| 久久久久高清精品| 欧美电影在线免费观看| 色先锋久久av资源部| 粉嫩aⅴ一区二区三区四区五区 | 日韩精品在线看片z| 色菇凉天天综合网| 成人黄色一级视频| 国产麻豆精品在线观看| 久久91精品久久久久久秒播| 亚洲国产综合视频在线观看| 亚洲女子a中天字幕| 中文字幕免费一区| 欧美激情在线一区二区三区| 91首页免费视频| 91在线视频18| av在线这里只有精品| 国产精品一区二区黑丝| 久久精品国产一区二区| 国产一区二区三区在线观看精品| 日韩国产在线一| 一区二区欧美视频| 日韩视频一区二区在线观看| 91麻豆精品国产91久久久| 欧美一区二区三区日韩视频| 欧美日韩免费视频| 欧美精品日韩精品| 日韩欧美在线影院| 日韩欧美国产综合一区| 日韩精品自拍偷拍| 2欧美一区二区三区在线观看视频| 日韩欧美亚洲另类制服综合在线 | 91浏览器在线视频| 日本中文一区二区三区| 久久久久亚洲综合| 欧美一区二区成人| 96av麻豆蜜桃一区二区| 亚洲一区二区三区四区在线免费观看| 国产精品狼人久久影院观看方式| 久久综合久久久久88| 精品美女一区二区| 成人小视频在线| 高清成人在线观看| 亚洲国产视频一区二区| 亚洲色图都市小说| 欧美久久婷婷综合色| 91福利视频久久久久| 日韩欧美国产三级| 国产精品国产三级国产aⅴ入口 | 成人免费av资源| 91亚洲国产成人精品一区二三 | 欧美人体做爰大胆视频| 欧美电视剧免费全集观看| 久久免费国产精品| 成人免费在线播放视频| 亚洲图片欧美综合| 国产在线播放一区| 欧洲一区在线电影| 国产亚洲欧美在线| 亚洲大尺度视频在线观看| 国产一区二区在线免费观看| 色综合久久久网| 久久婷婷一区二区三区| 一区二区三区欧美久久| 黄色成人免费在线| 精品视频999| 欧美视频中文一区二区三区在线观看| 欧美性xxxxxxxx| 欧美精品v国产精品v日韩精品| 91久久久免费一区二区| 在线精品观看国产| 538在线一区二区精品国产| 宅男在线国产精品| 久久免费电影网| 一区二区三区四区五区视频在线观看 | 99re成人在线| 国产一区二区三区在线观看精品| 香蕉久久一区二区不卡无毒影院| 亚洲国产一区二区视频| 一区二区三区免费观看| 中文字幕在线一区二区三区| 国产午夜精品理论片a级大结局| 亚洲永久精品国产| 91首页免费视频| 国产精品网站在线观看| 日日夜夜免费精品| 欧美日韩精品一区二区在线播放| 中日韩免费视频中文字幕| 国产真实乱偷精品视频免| 欧美一级午夜免费电影| 亚洲国产综合视频在线观看| 91麻豆免费观看| 国产精品久久久久久亚洲伦 | 国产制服丝袜一区| 7777女厕盗摄久久久| 舔着乳尖日韩一区| 欧美在线啊v一区| 亚洲品质自拍视频| 成年人午夜久久久| 国产精品传媒入口麻豆| 国产精品2024| 国产精品毛片大码女人| 国产成人在线看| 99视频一区二区| 欧美吞精做爰啪啪高潮| 日韩欧美黄色影院| 国产精品久久久久久一区二区三区 | 欧美一区二区视频免费观看| 国产米奇在线777精品观看| 亚洲国产精品一区二区尤物区| 久久亚洲综合av| 91精品国产一区二区三区| 欧美午夜精品一区二区蜜桃| 91论坛在线播放| jizz一区二区| www.亚洲精品| 99久久久精品免费观看国产蜜| 粉嫩嫩av羞羞动漫久久久| 国产专区综合网| 国产精品18久久久久久久久久久久 | 色综合天天综合色综合av| 九九视频精品免费| 韩国一区二区三区| 久久国内精品自在自线400部| 婷婷夜色潮精品综合在线| 亚洲成人午夜电影| 午夜精品久久久久久久久久久| 亚洲综合色视频| 亚洲成年人网站在线观看| 日韩成人一级大片| 亚洲综合精品久久| 色呦呦国产精品| 精品成人在线观看| 99久久国产综合精品麻豆| 欧美一区二区日韩一区二区| 美女任你摸久久 | 日日摸夜夜添夜夜添亚洲女人| 91麻豆自制传媒国产之光| 久久久久88色偷偷免费| 91蜜桃视频在线|