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