zoukankan      html  css  js  c++  java
  • 缓存服务器哈希一致性操作

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

    <?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();
    
    
    ?>
  • 相关阅读:
    html中的a标签
    dl,dt,dd标签的使用
    MySQL innodb中各种SQL语句加锁分析
    Js字符串与十六进制的相互转换 【转】
    亿级Web系统搭建:单机到分布式集群【转】
    pm2 设置开机启动
    spring cloud 项目相关集成简介
    spring boot下JedisCluster方式连接Redis集群的配置
    并发编程 – Concurrent 用户指南--转
    JDBC 事务和 JTA 事务
  • 原文地址:https://www.cnblogs.com/dawq/p/5763978.html
Copyright © 2011-2022 走看看