memcached 分布式 一致性hash算法demo
生活随笔
收集整理的這篇文章主要介紹了
memcached 分布式 一致性hash算法demo
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一致性Hash分布算法分4個步驟:
步驟1:將一個32位整數[0 ~ (2^32-1)]想象成一個環,0 作為開頭,(2^32-1) 作為結尾,當然這只是想象。
步驟2:通過Hash函數把KEY處理成整數。這樣就可以在環上找到一個位置與之對應。
步驟3:把Memcached服務器群映射到環上,使用Hash函數處理服務器對應的IP地址即可。
步驟4:把數據映射到Memcached服務器上。查找一個KEY對應的Memcached服務器位置的方法如下:從當前KEY的位置,沿著圓環順時針方向出發,查找位置離得最近的一臺Memcached服務器,并將KEY對應的數據保存在此服務器上。
?
代碼實例:
<?php /*** 一致性Hash分布* 天涯PHP博客* http://blog.phpha.com*/ class FlexiHash{//服務器列表private $serverList = array();//記錄是否已經排序private $isSorted = FALSE;//添加一臺服務器public function addServer($server){$hash = $this->mHash($server);if(!isset($this->serverList[$hash])){$this->serverList[$hash] = $server;}//需要重新排序$this->isSorted = FALSE;return TRUE;}//移除一臺服務器public function removeServer($server){$hash = $this->mHash($server);if(isset($this->serverList[$hash])){unset($this->serverList[$hash]);}//需要重新排序$this->isSorted = FALSE;return TRUE;}//在當前服務器列表查找合適的服務器public function lookup($key){$hash = $this->mHash($key);//先進行倒序排序操作if(!$this->isSorted){krsort($this->serverList, SORT_NUMERIC);$this->isSorted = TRUE;}//圓環上順時針方向查找當前KEY緊鄰的一臺服務器foreach($this->serverList as $pos => $server){if($hash >= $pos) return $server;}//沒有找到則返回順時針方向最后一臺服務器return $this->serverList[count($this->serverList) - 1];}//Hash函數private function mHash($key){$md5 = substr(md5($key), 0, 8);$seed = 31;$hash = 0;for($i = 0; $i < 8; $i++){$hash = $hash * $seed + ord($md5{$i});$i++;}return $hash & 0x7FFFFFFF;} } ?>
測試:
?
<?php /*** 一致性Hash分布測試代碼* 天涯PHP博客* http://blog.phpha.com*/ $hserver = new FlexiHash(); //初始5臺服務器 $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"); echo "save key1 in server: ", $hserver->lookup('key1'), "<br/>"; echo "save key2 in server: ", $hserver->lookup('key2'), "<br/>"; echo '===============================================<br/>'; //移除1臺服務器 $hserver->removeServer("192.168.1.4"); echo "save key1 in server: ", $hserver->lookup('key1'), "<br/>"; echo "save key2 in server: ", $hserver->lookup('key2'), "<br/>"; echo '===============================================<br/>'; //添加1臺服務器 $hserver->addServer('192.168.1.6'); echo "save key1 in server: ", $hserver->lookup('key1'), "<br/>"; echo "save key2 in server: ", $hserver->lookup('key2'); ?>//測試結果如下: save key1 in server: 192.168.1.4 save key2 in server: 192.168.1.2 ================================== save key1 in server: 192.168.1.3 save key2 in server: 192.168.1.2 ================================== save key1 in server: 192.168.1.3 save key2 in server: 192.168.1.2
轉載于:https://www.cnblogs.com/icyy/p/5198998.html
總結
以上是生活随笔為你收集整理的memcached 分布式 一致性hash算法demo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置Eclipse中的tab键为4个空格
- 下一篇: GetLastError()函数返回值及