memcached分布式一致性哈希算法

<span style="font-family: FangSong_GB2312; background-color: rgb(255, 255, 255);">如果想在多台服务器上使用memcached缓存,首先是要保证到每台服务器上缓存的数据比较均匀,这样会充分利用服务器的资源。速度也是很快。</span>

1、memcached缓存支持多实例,但是具体将缓存放置在具体的哪一台服务器上面这个算法是需要我们自己来完成的。前面的文章中有提到使用取余数来计算,但是如果其中有服务器出现问题,那样缓存就被打乱了。

2、使用一致性哈希算法来实现

思想:

1)、将服务器的名字和键值都统一化成比较大的整数,如php使用crc32()这个函数。

2)、然后就是将一台服务器虚拟成多台服务器,这样数据分散的就是比较均匀,

3)、在这些数据上面,以一个圆的形式。从圆的一点开始查找,查到比圆上面小的一点就将该键的缓存放置到找到的服务器上面。这样服务器越多,其中一台或多台服务器出现了问题,都能很好的使用缓存,这样命中率下降的不大。


<?php

/**
 * 随机生成一个数接口
     */
    interface Hash {
    	Public function _hash($str);
    }
    
    /**
     * 查找出键的位置
     */
    interface Distribution {
    	Public function lookup ($key);
    }
    
    /**
     * 分布式类
     */
    Class Contain implements Hash,Distribution {
    	Protected $_node = array();
    	Protected $_mul = 64;
    	Public function _hash($str) {
    		return sprintf('%u', crc32($str));
    	}
    
    	Public function lookup($key) {
    		$point = $this->_hash($key);
    		$node = current($this->_node);
    		foreach ($this->_node as $k => $v) {
    			if ($point <= $k) {
    				$node = $v;
    				break;
    			}
    		}
    		return $node;
    	}
    
    	/**
    	 * 添加服务器节点
    	 */
    	Public function addNode($node) {
    		
    		for ($i=0; $i < $this->_mul ; $i++) { 
    			$this->_node[$this->_hash($node . '-' . $i)] = $node;
    		}
    
    		//$point = $this->_hash($node);
    		//$this->_node[$point] = $node;
    		$this->sortNode();
    	}
    
    	Public function sortNode() {
    		ksort($this->_node, SORT_REGULAR);
    
    	}
    
    	/**
    	 * 测试的函数
    	 */
    	Public function printSort() {
		echo '<pre>';
		print_r($this->_node);
	}
}


原文地址:https://www.cnblogs.com/shiwenhu/p/4419088.html