架构师训练营第 1 期 - 第五周作业提交
发布于: 2020 年 10 月 25 日
作业一(2 选 1):
用你熟悉的编程语言实现一致性 hash 算法。
编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。
// 一致性哈希算法
class ConsistentHash {
protected $realNodes = array ();
protected $vitualNodes = array ();
protected $count = 150; //真实节点对应的虚拟节点数量
/**
* Hash取值
* @param $str
* @return string
*/
private function hash($str) {
return sprintf('%u', crc32($str));
}
/**
* 定位
* @param $key
* @return mixed
*/
public function pos($key) {
$point = $this->hash($key);
$node = $this->vitualNodes[0];//初始节点
//循环找到环上最近的点
foreach ($this->vitualNodes as $key => $val) {
if ($point <= $key) {
$node = $val;
break;
}
}
return $node;
}
public function addNode($node) {
if (isset($this->realNodes[ $node ])) return;//排除重复增加
for ($i = 0; $i < $this->count; $i++) {
$pos = $this->hash($node . '-' . $i);//计算落点
$this->vitualNodes[ $pos ] = $node;//添加虚拟节点
$this->realNodes[ $node ][] = $pos;//添加真实节点
}
// 重新排序
$this->sortPos();
}
public function delNode($node) {
if (!isset($this->realNodes[ $node ])) return;
// 循环删除虚拟节点
foreach ($this->realNodes[ $node ] as $val) {
unset($this->vitualNodes[ $val ]);
}
// 删除节点
unset($this->realNodes[ $node ]);
}
public function sortPos() {
ksort($this->vitualNodes, SORT_REGULAR);
}
}
复制代码
划线
评论
复制
发布于: 2020 年 10 月 25 日阅读数: 36
Todd-Lee
关注
还未添加个人签名 2017.10.17 加入
还未添加个人简介
评论