memcache分布式算法(哈希一致性算法)

看了网上memcached视频教程自己用php写的memcache分布式哈希一致性算法。

<?php
/**
 * Class Memcache
 * memcache分布式哈希一致性算法
 * author  mn
 * version 1.0
 * date 2018/3/1
 */
class MemcacheCtl{
    //memcache服务器列表
    private static $serArr = [
        ['host'=>'localhost','port'=>11211],
        ['host'=>'localhost','port'=>11212],
        ['host'=>'localhost','port'=>11213],
        ['host'=>'localhost','port'=>11214],
        ['host'=>'localhost','port'=>11215],
    ];

    private static $nodeArr=[];//服务器节点数组
    public static $vnodeArr=[];//虚拟节点数组

    public static $mObj;//单例对象


    private function __construct()
    {

    }

    private function __clone()
    {

    }

    //进行节点的计算和虚拟节点的添加
    private static function setVNode(){
        foreach(self::$serArr as $k=>$v){
            //给真实节点编号
            $node = sprintf('%u',crc32(implode('-',$v)));
            $key = implode('-',$v);
            self::$nodeArr[$key] = $node;

            //虚拟节点编号  一个真实节点添加100个虚拟节点
            for($i=0;$i<100;$i++){
                $vnode = sprintf('%u',crc32(implode('-',$v).'*'.$i));
                $vkey = implode('-',$v).'*'.$i;
                self::$vnodeArr[$vkey] = $vnode;
            }

        }
        asort(self::$vnodeArr,SORT_NUMERIC);
    }

    //初始化方法
    private static function mObj($key){
        self::setVNode();
        $ser = self::getSer($key);
        if(!is_object(self::$mObj)){
            self::$mObj = new \Memcache();
        }
        self::$mObj->pconnect($ser[0],$ser[1],5);
    }

    //根据key值得到该key应该存在哪个真实服务器节点
    private static function getSer($key){
        $knode = sprintf('%u',crc32($key));
        reset(self::$vnodeArr);
        $vnode = key(self::$vnodeArr);
        foreach(self::$vnodeArr as $k=>$v){
            if($knode<=$v){
                $vnode = $k; //所属虚拟节点
                break;
            }

        }
        $nodeKey = explode('*',$vnode);
        return explode('-',$nodeKey[0]);
    }

    //添加数据方法
    public static function set($key,$value,$timestamp=0){
        self::mObj($key);
        $res = self::$mObj->set($key,$value,0,$timestamp);
        return $res;
    }

    //获取数据方法
    public static function get($key){
        self::mObj($key);
        $res = self::$mObj->get($key);
        return $res;
    }


    //获取数据的命中率
    public static function getAllSerStats(){
        $bj = new \Memcache();
        $hits = 0;
        $misses = 0;
        foreach(self::$serArr as $k=>$v){
            $bj->connect($v['host'],$v['port']);
            $res = $bj->getStats();
            $hits += $res['get_hits'];
            $misses += $res['get_misses'];
        }
        return ['hits'=>$hits,'misses'=>$misses];
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值