<?php//原理概念请看我的上一篇随笔(http://www.cnblogs.com/tujia/p/5416614.html)或直接百度
/**
 * 接口:hash(哈希插口)、distribution(分布式算法接口)
 * 方法:
 * hash
 *     _hash,处理并返回一个字符串的哈希值
 * distribution
 *  _lookup:给它一个key,它要反正此key需要存取的目标服务器信息
 *
 *
 * 一致性哈希分布式算法类:ConsistentHash
 * 方法:
 *     addServ:    添加服务器
 *     addPos:    添加”虚拟节点“
 *     sortPos:    对所有”虚拟节点“进行排序,形成集群圈
 *  _hash:        实现插口的_hash方法
 *  _lookup:    实现插口的_lookup方法
 *
 * 测试用方法
 *     printServ:    打印集群中的服务器列表信息
 *     printPos:    打印集群中的虚拟节点列表信息
 *     decServ:    删除一台服务器及他的所有虚拟节点
 */

interface hash{
    public function _hash($str);
}

interface distribution{
    public function _lookup($key);
}

/**
* 一致性哈希算法类
*/
class ConsistentHash implements hash,distribution
{
    protected $mem_serv = array();//服务器列表
    protected $node_pos = array();//所有虚拟节点
    protected $mul         = 64;//第一台服务器弄64个虚拟节点
    /**
     * 添加服务器
     * @param array $serv_info 服务器配置信息,格式为:array('host':'127.0.0.1', 'port':11211);
     */
    public function addServ($serv_info){
        if(!is_array($serv_info) || !isset($serv_info['host']) || !isset($serv_info['port'])) return false;

        $str                        = $serv_info['host'] .':'. $serv_info['port'];
        $serv_key                     = $this->_hash($str);
        //记录服务器信息
        $this->mem_serv[$serv_key]     = $serv_info;

        //添加虚拟节点
        $this->addPos($serv_key);
        return true;
    }

    /**
     * 添加虚拟节点
     * @param string $serv_key 服务器的key
     */
    protected function addPos($serv_key){
        for($i=0; $i<$this->mul; $i++){
            $pos         = 'node_' . $serv_key . '_' . $i;
            $pos_hash     = $this->_hash($pos);
            $this->node_pos[$pos_hash] = $serv_key;
        }
        $this->sortPos();
        return true;
    }

    /**
     * 对所有虚拟节点进行排序
     */
    protected function sortPos(){
        return ksort($this->node_pos);
    }

    /**
     * 对字符串进行hash处理,返回其整数无符号整数值
     * @param  string $str 要进行处理的字符串
     */
    public function _hash($str){
        return sprintf("%u", crc32($str));
    }

    /**
     * 通过key计算它的落点服务器信息
     * @param  string $key 键
     */
    public function _lookup($key){
        $key_hash = $this->_hash($key);

        $serv_key = key($this->mem_serv);
        foreach ($this->node_pos as $pos=>$serv) {
            if($key_hash<=$pos){
                $serv_key = $serv;
                break;
            }
        }

        return $this->mem_serv[$serv_key];
    }

    /**
     * 以下的方法做为测试用
     */

    /**
     * 打印服务器列表
     * @return [type] [description]
     */
    public function printServ(){
        echo '<pre>';
        print_r($this->mem_serv);
        echo '</pre>';
    }

    public function printPos(){
        echo '<pre>';
        print_r($this->node_pos);
        echo '</pre>';
    }

    /**
     * 删除一个服务器及它的所有虚拟节点
     * @param  int $serv_key 服务器的hash值
     */
    public function decServ($serv_key=''){
        if(empty($serv_key)) $serv_key = key($this->mem_serv);
        unset($this->mem_serv[$serv_key]);
        return true;
    }
}

//测试
/*$dis = new ConsistentHash();
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11211));
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11212));
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11213));
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11214));
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11215));

$dis->printServ();
$dis->printPos();

print_r($dis->_lookup('name'));
print_r($dis->_lookup('age'));
print_r($dis->_lookup('sex'));
print_r($dis->_lookup('height'));
print_r($dis->_lookup('weight'));*/
?>

php实现一致性哈希算法的更多相关文章

  1. 一致性哈希算法与Java实现

    原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  2. 五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...

  3. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  4. 一致性哈希算法以及其PHP实现

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括:  轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...

  5. Java_一致性哈希算法与Java实现

    摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  6. 一致性哈希算法(consistent hashing)【转】

    一致性哈希算法 来自:http://blog.csdn.net/cywosp/article/details/23397179       一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 ...

  7. 一致性哈希算法学习及JAVA代码实现分析

    1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...

  8. 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据

    一致性哈希算法 摘自:http://blog.codinglabs.org/articles/consistent-hashing.html 算法简述 一致性哈希算法(Consistent Hashi ...

  9. 一致性哈希算法原理及Java实现

     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单 ...

  10. _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...

随机推荐

  1. mysql修改数据库表权限

    ps:通常我用的是:1.“grant all on *.* to root@'%' identified by 'yourpassword';”——这个还可以顺带设置密码.2.“flush privi ...

  2. 旨在脱离后端环境的前端开发套件 - IDT之Server篇

    IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...

  3. 利用 NGINX 最大化 Python 性能,第一部分:Web 服务和缓存

    [编者按]本文主要介绍 nginx 的主要功能以及如何通过 NGINX 优化 Python 应用性能.本文系国内 ITOM 管理平台 OneAPM 编译呈现. Python 的著名之处在于使用简单方便 ...

  4. Python Tricks 若干

    赵斌 - APRIL 29, 2015 在 python 代码中可以看到一些常见的 trick,在这里做一个简单的小结. json 字符串格式化 在开发 web 应用的时候经常会用到 json 字符串 ...

  5. 提高Python运行效率的六个窍门

    曾灵敏 - MAY 18, 2015 Python是一门优秀的语言,它能让你在短时间内通过极少量代码就能完成许多操作.不仅如此,它还轻松支持多任务处理,比如多进程. 不喜欢Python的人经常会吐嘈P ...

  6. iOS第三方推送-极光推送

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  7. 机器学习之神经网络模型-上(Neural Networks: Representation)

    在这篇文章中,我们一起来讨论一种叫作"神经网络"(Neural Network)的机器学习算法,这也是我硕士阶段的研究方向.我们将首先讨论神经网络的表层结构,在之后再具体讨论神经网 ...

  8. jmeter if 控制器

    判断变量值是不是为空(有没有被赋值): "${jd_aid}"!="\${jd_aid}"

  9. centos使用fuse挂载NTFS

    FUSE:用户空间文件系统(Filesystem in Userspace),是Linux 中用于挂载某些网络空间,如SSH,到本地文件系统的模块.如果装的是双系统,centOS并不支持ntfs分区, ...

  10. Data Flow ->> CDC Control Task, CDC Source, CDC Splitter

    CDC Control Task可以从控制CDC数据同步,比如初始化加载.LSN范围的管理.它可以代替另一种做法,就是通过调用一批CDC函数来完成同样的事情.从SSIS的角度来完成,事情编程简单,和另 ...