今天在看redis集群實現原理時,提到了一致性hash演算法。已經不是第一次聽到這個詞了,今天特意了解了一下實現原理。
關於一致性hash演算法的原理,主要是核心兩點:
<?php
/** * 一致性雜湊實現介面
* inte***ce consistenthash
*/inte***ce consistenthash
/** * 具體一致性雜湊實現
* author chenqionghe
* class myconsistenthash
*/class myconsistenthash implements consistenthash
/*** 新增一台伺服器到伺服器列表中
* @param $server 伺服器ip位址
* @return bool
*/public function addserver(string $server)
//虛擬節點根據位置排序
ksort($this->virtualpos, sort_numeric);}}
/*** 移除一台伺服器(迴圈所有的虛節點,刪除值為該伺服器位址的虛節點)
* @param $key
* @return bool
*/public function removeserver(string $key)
//刪除對應伺服器
unset($this->serverlist[$key]);}}
/*** 在當前的伺服器列表中找到合適的伺服器存放資料
* @param $key 鍵名
* @return mixed 返回伺服器ip位址
*/public function lookup(string $key)
}reset($this->virtualpos); //重置圓環的指標為第乙個(重置陣列的指標)
return $finalserver;
}}$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');
echo "增加5臺伺服器192.168.1.1~192.168.1.5\n";
echo "\n";
echo "儲存 key1 到 server :" . $hashserver->lookup('key1') . "\n";
echo "儲存 key2 到 server :" . $hashserver->lookup('key2') . "\n";
echo "儲存 key3 到 server :" . $hashserver->lookup('key3') . "\n";
echo "儲存 key4 到 server :" . $hashserver->lookup('key4') . "\n";
echo "儲存 key5 到 server :" . $hashserver->lookup('key5') . "\n";
echo "儲存 key6 到 server :" . $hashserver->lookup('key6') . "\n";
echo "儲存 key7 到 server :" . $hashserver->lookup('key7') . "\n";
echo "儲存 key8 到 server :" . $hashserver->lookup('key8') . "\n";
echo "儲存 key9 到 server :" . $hashserver->lookup('key9') . "\n";
echo "儲存 key10 到 server :" . $hashserver->lookup('key10') . "\n";
echo "\n";
echo '虛擬機器節點數:' . count($hashserver->virtualpos) . "\n";
echo "\n";
echo "查詢 key6 節點對應的 service :" . $hashserver->lookup('key6') . "\n";
**實現:
參考:
Hash和一致性Hash演算法
hash hash無論是資料結構還是分布式快取,都有應用。hash更確切的說是hash函式,是乙個集合的資料到另乙個集合內資料的乙個對映。被對映方在數學裡面叫做原象,這裡我們叫做資料,對映到的叫象,這裡我們稱作槽。分布式快取伺服器和應用伺服器的區別在於,應用伺服器中的所有伺服器都部署著相同的應用,而...
Hash演算法和一致性Hash演算法
我們對同乙個名稱做相同的雜湊計算時,得出的結果應該是不變的,如果我們有3臺伺服器,使用雜湊後的結果對3求餘,那麼餘數一定是0 1或者2,正好與我們之前的伺服器編號相同,如果求餘的結果為0,我們就把當前名稱對應的快取在0號伺服器上,如果餘數為1,就把當前名對應的快取在1號伺服器上,如果餘數為2,同理,...
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...