PHP 一致性哈希算法的一種簡單實現


在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用HASH的方式將業務請求分散到這些節點處理,比如memecache緩存等分 布式集群應用,如果只是簡單的使用,不涉及用戶用戶狀態等信息,則可以直接采用取模算法。正常情況下,取模算法好像也不錯,但是一旦增加節點或者其中一個 節點上宕機的話,命中率將會急劇降低,所以取模算法在這種情況下弊端很明顯,為此,在1997年由麻省理工學院提出的一種分布式哈希(DHT)實現算法。 具體的算法介紹我這里不多少了,需要了解的可以參見本文:http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html

 

下面貼一個用PHP對其進行的簡單實現

class Hash
{
    //落點集合,可以緩存起來
    private $_locations = array();
    //虛擬節點數量
    private $virtualNodeNum = 24;
    //維護的另一種節點和虛擬節點對應關系,方便刪除
    private $_nodes;
    //將字符串轉成數字
    private function _hash($str)
    {
        return sprintf('%u', crc32($str));
    }

    /**
     * 尋找字符串所在的機器位置
     * @param $str
     * @return bool|mixed
     */
    public function getLocation($str)
    {
        if(empty($this->_locations)){
            return false;
        }else{
            $position = $this->_hash($str);
            //默認取第一個節點
            $node = current($this->_locations);
            foreach($this->_locations as $k=>$v){
                //如果當前的位置,小於或等於節點組中的一個節點,那么當前位置對應該節點
                if($position <= $k){
                    $node = $v;
                    break;
                }
            }
            return $node;
        }
    }

    /**
     * 添加一個節點
     * @param $node
     */
    public function addNode($node)
    {
        //生成虛擬節點
        for($i=0;$i<$this->virtualNodeNum;$i++){
            $tmp = $this->_hash($node.$i);
            $this->_locations[$tmp] = $node;
            $this->_nodes[$node][] = $tmp;
        }
        //對節點排序
        ksort($this->_locations,SORT_NUMERIC);
    }

    /**
     * 刪除一個節點
     * @param $node
     */
    public function deleteNode($node)
    {
        foreach($this->_nodes[$node] as $v){
            unset($this->_locations[$v]);
        }
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM