php使用hash环分表mysql

1 篇文章 0 订阅

 使用 hash环 分表 扩容不影响正常运行,减少数据迁移

 

<?php
/**
 *   使用 hash环 分表 扩容不影响正常运行,减少数据迁移
 */
class Consistance
{
    protected $num=24;          //设定每一个服务器的节点数,数量越多,宕机时服务器负载就会分布得越平均,但也增大数据查找消耗。
    protected $nodes=array();   //当前服务器组的结点列表。

    //计算一个数据的哈希值,用以确定位置
    public function make_hash($data)
    {
      $str = sprintf('%u',crc32(strtolower(md5($data))));
      $str = abs($str);
      return $str;
    }

    //遍历当前服务器组的节点列表,确定需要存储/查找的服务器
    public function set_loc($data)
    {
        $loc=self::make_hash($data);
        foreach ($this->nodes as $key => $val)
        {
            if($loc<=$key)
            {
                return $val;
            }
        }
      $new = array_values($this->nodes);
      return $new[0];//没有存返回第一
    }

    //添加一个服务器,将其结点添加到服务器组的节点列表内。
    public function add_host($host)
    {
        for($i=0;$i<$this->num;$i++)
        {
            $key=sprintf('%u',crc32(md5($host.'_'.$i)));
            $this->nodes[$key]=$host;   
        }
        ksort($this->nodes);        //对结点排序,这样便于查找。
    }

    //删除一个服务器,并将其对应节点从服务器组的节点列表内移除。
    public function remove_host($host)
    {
        for($i=0;$i<$this->num;$i++)
        {
            $key=sprintf('%u',crc32(md5( $host.'_'.$i)));
            unset($this->nodes[$key]);
        }
    }
}
$consistance = new Consistance();
$consistance->add_host("192.168.1.1.user_1");
$consistance->add_host("192.168.1.1.user_2");
//$consistance->add_host("192.168.1.1.user_3");





//
for ($i=670;$i<675;$i++){
    echo "{$i}:";
    echo $consistance->set_loc($i)." \n";
}



echo "crc32:".crc32("100");
?>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值