一致性hash算法-php-redis版本

转载 2015年07月09日 23:10:23
<?php
//抄过来的代码,改了一点点,
//实际来说,效率偏低,命中还算均匀

 class RedisHash {

	private $_node = array();
	private $_nodeData = array();
	private $_keyNode = 0;
	private $_redis = null;
	public  $nodeCounter=[];
	
	//每个物理服务器生成虚拟节点个数 [注:节点数越多,cache分布的均匀性越好,
	//同时set get操作时,也更耗资源,10台物理服务器,采用200较为合理]
	private $_virtualNodeNum = 100;
	
	private function __construct() {
	       
		$config = [
			'127.0.0.1:6370',
			'127.0.0.1:6371',
			'127.0.0.1:6372',
			'127.0.0.1:6373',
			'127.0.0.1:6374',
			'127.0.0.1:6375',
			'127.0.0.1:6376',
			'127.0.0.1:6377',
			'127.0.0.1:6378',
			'127.0.0.1:6379',
		];				       
		if (!$config) throw new Exception('Cache config NULL');
		
		foreach ($config as $key => $value) {
			for ($i = 0; $i < $this->_virtualNodeNum; $i++) {
				$this->_node[sprintf("%u", crc32($value . '_' . $i))] = $value . '_' . $i;
			}
		}
		ksort($this->_node);
	}

	private function __clone(){}
	
	
	static public function getInstance() {
		static $redisObj = null;
		if (!is_object($redisObj)) {
			$redisObj = new self();
		}
		return $redisObj;
	}
	
	
	public function getRedis($key) {
		$this->_nodeData = array_keys($this->_node);
		$this->_keyNode = sprintf("%u", crc32($key));
		$nodeKey = $this->_findServerNode();		
		//如果超出环,从头再用二分法查找一个最近的,然后环的头尾做判断,取最接近的节点
		if ($this->_keyNode > end($this->_nodeData)) {
			$this->_keyNode -= end($this->_nodeData);
			$nodeKey2 = $this->_findServerNode();
			if (abs($nodeKey2 - $this->_keyNode) < abs($nodeKey - $this->_keyNode))  $nodeKey = $nodeKey2;
		}
		
		// var_dump($this->_node[$nodeKey]);
		
		list($config, $num) = explode('_', $this->_node[$nodeKey]);
		if (!$config) throw new Exception('Cache config Error');
		if (!isset($this->_redis[$config])) {
			$this->_redis[$config] = new \Redis;
			list($host, $port) = explode(':', $config);
			$this->_redis[$config]->connect($host, $port);	
		}
		
		$this->nodeCounter[$config] ++;
		
		return $this->_redis[$config];
	}
	
	
	private function _findServerNode($m = 0, $b = 0) {
	    $total = count($this->_nodeData);
	    if ($total != 0 && $b == 0) $b = $total - 1;
	    if ($m < $b){
			$avg = (int)(($m+$b) / 2);
			if ($this->_nodeData[$avg] == $this->_keyNode) {
				return $this->_nodeData[$avg];
			}elseif ($this->_keyNode < $this->_nodeData[$avg] && ($avg-1 >= 0)) {
				return $this->_findServerNode($m, $avg-1);
			}else {
				return $this->_findServerNode($avg+1, $b);
			}
	    }
		if (abs($this->_nodeData[$b] - $this->_keyNode) < abs($this->_nodeData[$m] - $this->_keyNode))  return $this->_nodeData[$b];
		else return $this->_nodeData[$m];
	}
		
	public function set($key, $value, $expire = 0) {
	    return $this->getRedis($key)->set($key, $value,$expire);
	}
	
	
	public function get($key) {
		return $this->getRedis($key)->get($key);
	}
	
	public function delete($key) {
		return $this->getRedis($key)->delete($key);
	}
	
}

$time_start = microtime(true);
$redis = RedisHash::getInstance();
for($i=0;$i<10000;$i++) {
     $b = $redis->set('m_key'.$i, $i);
}
print_r($redis->nodeCounter);
echo  microtime( true ) - $time_start ;   



基于JQuery的弹幕APP

今天闲着无聊,写了个弹幕APP,主要实现以下几个功能: 1.点击“弹幕发射”或回车可以输出弹幕到弹幕墙上。 2.弹幕的运行轨迹是从弹幕墙的最右边到最左边,Y轴的数值在弹幕墙的高度内随机,颜色HEX...
  • alenhhy
  • alenhhy
  • 2017年02月09日 13:57
  • 408

7天入门php-文件打开/读取/写/常用判断

一、学几个基本的php文件操作函数 1、readfile(fileURL) :读取文件,并写入缓冲区。 例:echo readfile("text/txt1.txt"); //打印与当前页面位置同级的...

redis 一致性hash算法

网站为了支撑更大的用户访问量,往往需要对用户访问的数据做cache,服务机群和负载均衡来专门处理缓存,负载均衡的算法很多,轮循算法、哈希算法、最少连接算法、响应速度算法等,hash算法是比较常用的一种...

redis集群方案-一致性hash算法

前奏 集群的概念早在 Redis 3.0 之前讨论了,3.0 才在源码中出现。Redis 集群要考虑的问题: 节点之间怎么据的同步,如何做到数据一致性。一主一备的模式,可以用 Redis 内部实现...

redis等缓存相关的一致性hash算法

一致性哈希算法目前在缓存中

C# Redis客户端对一致性hash算法的实现

这里介绍的是C#的redis客户端 ServiceStack 对一致性hash算法的实现.主要涉及到类如下: ShardedConnectionPool ShardedRedisClientMa...

PHP相关系列 - memcache的一致性Hash算法

来源:http://blog.csdn.net/kongqz/article/details/6695417   一、概述   1、我们的memcache客户端(这里我看的spymemcache...
  • initphp
  • initphp
  • 2012年12月04日 18:34
  • 1303

memcache分布式 [一致性hash算法] 的php实现

最近在看一些分布式方面的文章,所以就用php实现一致性hash来练练手,以前一般用的是最原始的hash取模做分布式,当生产过程中添加或删除一台memcache都会造成数据的全部失效,一致性hash就是...

PHP实现:一致性HASH算法

一致性Hash算法php实现实例

下面使用php实现一致性Hash分布算法。 创建一个ConHash类,它有两个成员变量和三个成员方法。 变量: serverList//保存服务器列表serverList //保存服务器列表 ...
  • hzk_wen
  • hzk_wen
  • 2015年07月28日 20:46
  • 365
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一致性hash算法-php-redis版本
举报原因:
原因补充:

(最多只允许输入30个字)