PHP一致性hash的实现

本文详细介绍了一致性哈希算法的基本原理,并提供了一个简单的PHP实现。重点讨论了其在缓存集群中的应用,如何最小化数据迁移量,增强系统的稳定性和可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是剽窃了Flexihash的实现,不是本人所为,简化了实现的细节
http://code.google.com/p/flexihash/

一致性hash大多用于缓存集群中,为了使在缓存中由于一台或多台服务器宕机,导致后端数据库压力过大而崩溃,他对添加和减少缓存服务器迁移的数据量最小化,相对于取模来说

对于一致性hash的原理和介绍,网上有很多,我这里就不转帖了

    <?php
    /**
    *        Consisten Hashing
    *
    */


    class ConsistenHash {

            private $_targetNum = 0;

            //值越大,分布在环上的数据就越均匀
            private $_replicas = 64;

            private $_targetToPositions = array();

            private $_positionsToTargets = array();

            public function __construct($replicas = null){
                    if(!empty($replicas)) $this->_replicas = $replicas;
            }

            //添加单个目标
            public function addTarget($target){
                    //如果target为空则返回false
                    if(empty($target)) return false;

                    //如果target存在则返回
                    if(array_key_exists($target,$this->_targetToPositions)) return $this;

                    for($i=0;$i<$this->_replicas;$i++){
                            $position = $this->hash($target.$i);
                            $this->_positionsToTargets[$position] = $target;
                            $this->_targetToPositions[$target][] = $position;
                    }

                    $this->_targetNum++;
                    //ksort($this->_positionsToTargets,SORT_REGULAR);

            }

            //批量添加目标对象,在分布式缓存中为缓存服务器,如果在分表中,则为表名列表
            public function addTargets($targets){
                    if(is_array($targets)){
                            foreach($targets as $target){
                                    $this->addTarget($target);
                            }
                    }else{
                            $this->addTarget($target);
                    }
                    return $this;
            }

            //获取目标对应的位置对象
            public function getTarget($id){

                    if(empty($id)) return array();

                    if($this->_targetNum == 1)
                            return array_unique(array_values($this->_positionToTarget));

                    $position = $this->hash($id);

                    ksort($this->_positionsToTargets,SORT_REGULAR);

                    foreach($this->_positionsToTargets as $k=>$v){
                            if($k > $position){
                                    return $v;
                            }
                    }
            }

            //获取所有位置与目标对象列表
            public function getAllList($flag = null){
                    if(empty($flag)) {
                            return $this->_targetToPositions;
                    }
                    ksort($this->_positionsToTargets,SORT_REGULAR);
                    return $this->_positionsToTargets;
            }

            //通过crc32计算target和key的值
            public function hash($target){
                    $hash = sprintf("%u",crc32($target));
                    return $hash;
            }
    }
    ?>



以下是测试用的code:

    <?php

    require_once "consisten_hash.class.php";

    $hash = new ConsistenHash(8);

    $hash->addTargets(array('cache-001','cache-002','cache-003','cache-004'));

    print_r($hash->getAllList(true));


    $position = $hash->hash('abc');
    $target = $hash->getTarget('abc');
    echo $position."\n";
    echo $target."\n";
    ?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rorg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值