memcached缓存服务器一致性哈希分布部署类

class FlexHash{
    private $server_list = array();
    private $is_sort = false;
    public function add_server($server)
    {
        $hash = mhash(MHASH_MD5,$server);
        if(!isset($this->server_list[$hash])){
            $this->server_list[$hash] = $server;
        }
        $this->is_sort = false;
        return true;
    }
    public function remove_server($server)
    {
        $hash = mhash(MHASH_MD5,$server);
        if(isset($this->server_list[$hash])){
             unset($this->server_list[$hash]);
        }
        $this->is_sort = false;
        return true;
    }
    public function look_up($key)
    {
        $hash = mhash(MHASH_MD5,$key);
        if(!$this->is_sort){
            krsort($this->server_list,SORT_NUMERIC);
            $this->is_sort = true;
        }

        foreach ($this->server_list as $item => $value) {
            if($hash >= $value) return $value;
        }

        return $this->server_list[count($this->server_list) - 1];
    }
}

//echo $hash = mhash(MHASH_MD5,'1.2.3.4');

$server = new FlexHash();
$server->add_server('1.2.3.4');
$server->add_server('5.6.7.8');
$server->add_server('9.10.11.12');
$server->add_server('13.14.15.16');
$server->add_server('17.18.19.20');
$server->add_server('21.22.23.24');
$server->add_server('25.26.27.28');

echo "save 1 in ".$server->look_up('key1')."<br>";
echo "save 2 in ".$server->look_up('key2')."<br>";

$server->remove_server("21.22.23.24");
echo "save 1 in ".$server->look_up('key1')."<br>";
echo "save 2 in ".$server->look_up('key2')."<br>";

$server->add_server('29.30.31.32');
echo "save 1 in ".$server->look_up('key1')."<br>";
echo "save 2 in ".$server->look_up('key2')."<br>";

简单记录下实现的类,各位有则取之。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

luyaran

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

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

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

打赏作者

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

抵扣说明:

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

余额充值