memcache分布式集群算法——一致性哈希算法

一致性哈希

把各服务器节点映射放在钟表的各个时刻上,把 key 也映射到钟表的某个时刻上。该 key 沿钟表顺时针走,碰到的第 1 个节点即为该 key 的存储节点

这里写图片描述

实现:

<?php
//hash接口
interface hash{
    public function _hash($key);
}

//分布式接口
interface distribution{
    public function looup($key);
}

/**
*一致性哈希算法
*/
class Consistent implements hash,distribution{
    public $nodes = [];//服务器节点
    public $points = [];//服务器节点的虚拟节点
    public $_mul = 64;//每个节点的虚拟节点数量

    //hash方法
    public function _hash($key){
        return sprintf("%u",crc32($key));
    }

    //查找节点的方法
    public function looup($key){
        $hashKey = $this->_hash($key);
        $target = current($this->points);
        foreach ($this->points as $k => $v) {
            if($k >= $hashKey){
                $target = $v;
                break;
            }
        }
        reset($this->points);
        return $target;
    }

    //添加服务器节点
    public function addNode($node){
        //判断服务器节点是否存在
        if(isset($this->nodes[$node])){
            return ;
        }
        //生成虚拟节点
        for($i=1;$i<=$this->_mul;$i++){
            $point = $this->_hash($node.$i);//虚拟节点的hash值
            $this->points[$point] = $node;//将虚拟节点和服务器节点绑定
            $this->nodes[$node][] = $point;//在服务器节点上添加对应的虚拟节点
        }
        $this->_sort();//将虚拟节点排序
    }

    //删除服务器节点
    public function delNode($node){
        foreach ($this->nodes[$node] as $p) {
            unset($this->points[$p]);
        }
        unset($this->nodes[$node]);
    }

    //给虚拟节点排序
    public function _sort(){
        ksort($this->points,SORT_NUMERIC);
    }
}


$con = new Consistent();
$con->addNode('a');
$con->addNode('b');
$con->addNode('c');
$con->addNode('d');

echo $con->looup('title');
echo $con->looup('name');
echo $con->looup('age');

首先创建一个Consistent类的实例,然后调用addNode方法,这个方法用于添加服务器节点,首先判断该节点是否存在,如果不存在,然后创建出来对应的虚拟节点,并添加上关联关系,最后将虚拟节点进行排序。
调用looup方法就可以查找key值落在的服务器,首先将key值hash,得到hash值,然后遍历所有的虚拟节点,找到第一个大于key的hash值的虚拟节点,并返回该虚拟节点所对应的服务器节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值