码迷,mamicode.com
首页 > 其他好文 > 详细

缓存服务器哈希一致性操作

时间:2016-08-12 11:44:42      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

这两天在研究缓存服务器的哈希一致性,看介绍文档对一些具体概念操作起来有点模糊,搜索到一篇具体的代码实现,记录下来,以备温习。废话不多说,直接上代码,非常简单清晰明了

<?php
/**
 *@author:xiaojiang 20140222
 * 一致性哈希php 实现
 */

class MyHash{
    
    //虚拟节点数
    private $_virtualCounts = 2; 
    //虚拟节点集合
    private $_circleItems = array();
    //实际节点
    private $_items = array();
    //实际节点数
    private $_itemsCount = 0;
    //是否需要排序
    private $_itemRelKey = array();
    private $needSort = false;


    private $algo;

    public function __construct( hash_algo $algo = null ){
        if( !$algo ){
            $this->algo = new algo_md5();
        }
    }

    public function addItem( $_item ){
        
        if( isset( $this->_items[$_item]) ){
            throw new Exception("item exists");
        }
        $this->_items[$_item] = array();
        for( $i = 0; $i < $this->_virtualCounts; $i++ ){
             $_virturalKey = $this->algo->run( $_item.$i );
             $this->_circleItems[$_virturalKey] = $_item;
             $this->_itemRelKey[$_item][] = $_virturalKey; 
        }
        $this->needSort = true;
        $this->_itemsCount++;
    }

    public function removeItem( $_item ){
    
        if( !isset( $this->_items[$_item] ) ){
            throw new Exception("item is not exists");
        }
        foreach( $this->_itemRelKey[$_item] as $key){
            unset( $this->_circleItems[$key] );
        }
        unset($this->_items[$_item]);
        $this->_itemsCount--;
    }


    public function getKey( $str ){

        if($this->needSort){
            $this->sortItems();
        }    
        
        $_sk = $this->algo->run( $str );
        echo $_sk;
        foreach( $this->_circleItems as $key => $_item){
            
            if( $key > $_sk ){
                return $_item;
            }
        }
        $ret = array_values(array_slice($this->_circleItems , 0 ,1));
        return $ret[0];

    }

    private function sortItems(){
        
         ksort( $this->_circleItems ,SORT_STRING );
         $this->needSort = false;
    }

    public function _t(){
        print_r($this->_circleItems);
    }
}
Interface  hash_algo{
    function run();
}
class algo_md5{
    function run( $_str ){
        return MD5( $_str );
    }
}
$_tstr = "B8aaaaa";
$thash = new MyHash();
$thash->addItem("10.100.200.3");
$thash->addItem("10.100.200.4");

//$a = $thash->getKey($_tstr);
//$thash->_t();

$thash->removeItem("10.100.200.4");
$thash->_t();


?>

 

缓存服务器哈希一致性操作

标签:

原文地址:http://www.cnblogs.com/dawq/p/5763978.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!