下面使用php实现一致性Hash分布算法。
创建一个ConHash类,它有两个成员变量和三个成员方法。
变量:
serverList//保存服务器列表isSorted //记录服务器列表是否已经排过序。
方法:
addServer:添加一个服务器到服务器列表中
removeServer:从服务器列表中删除一个服务器
lookup:从当前服务器列表中找到合适的服务器存放数据。
代码如下:
<?php
class ConHash {
private $serverList = array();
private $isSorted = false;
function addServer($server) {...}
function removeServer($server) {...}
function lookup($key) {...}
}
?>
1)addServer方法实现
function addServer($server) {
$hash = mhash(MHASH_MD5,$server);
if(!isset($serverList[$hash])) {
$this->serverList[$hash]=$server;
}
$this->isSorted = false;
return true;
}
function removeServer($server) {
$hash=mhash(MHASH_MD5,$server);
if(isset($this->serverList[$hash])) {
unset($this->serverList[$hash]);
}
$this->isSorted = false;
return true;
}
3)lookup方法实现
function lookup($key) {
$hash=mhash(MHASH_MD5,$key);
if(!$this->isSorted) {
krsort($this->serverList);
$this->isSorted=true;
}
foreach($this->serverList as $pos =>$server) {
if($hash>=$pos) {
return $server;
}
}
return $this->serverList[count($this->serverList)-1];
}
lookup方法首先通过mHash函数计算出key的Hash值,然后判断服务器列表是否排过序,如果没有,就先对服务器列表进行倒序排序操作。倒序排序的作用是把服务器列表转换成一个逆时针的圆环。最后遍历服务器列表,找到一个合适的服务器返回。
4)测试代码
$hserver = new ConHash();
$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 "保存 key1 在 server:",$hserver->lookup(‘key1‘);
echo "保存 key2 在 server:",$hserver->lookup(‘key2‘);
echo ‘===================================‘;
$hserver->removeServer("192.168.1.2");
$hserver->removeServer("192.168.1.1");
echo "保存 key1 在 server:",$hserver->lookup(‘key1‘);
echo "保存 key2 在 server:",$hserver->lookup(‘key2‘);
echo ‘===================================‘;
$hserver->addServer("192.168.1.6");
echo "保存 key1 在 server:",$hserver->lookup(‘key1‘);
echo "保存 key2 在 server:",$hserver->lookup(‘key2‘);
测试结果具有随机性,在不同的机器上,可能出现的结果会有所不同。但这个例子解释了一致性Hash算法。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-10 01:09:05