[php]对服务器进行一致性hash分布算法

原创 2015年07月09日 18:28:40
<?php
/**
 * 对服务器进行一致性hash分布算法
 */
class HashRing
{
	private $servers = array();
	private $nodeList = array();
	private $nodeHashList = array();
	private $nodeTotalNum = 0;
	private $virtualNodeNum = 32;
	private $keyHash = '';

	public function __construct($servers)
	{
		$this->servers = $servers;
		foreach ($servers as $server) {
			for ($i = 0; $i < $this->virtualNodeNum; $i++) {
				$this->nodeList[sprintf("%u", crc32($server.'-'.$i))] = array($server, $i);
			}
		}
		ksort($this->nodeList);
		$this->nodeHashList = array_keys($this->nodeList);
	}

	private function getNodeIndex($key)
	{
		$this->keyHash = sprintf("%u", crc32($key));
		if ($this->keyHash > end($this->nodeHashList)) {
			$this->keyHash = $this->keyHash % end($this->nodeHashList);
		}
		if ($this->keyHash <= reset($this->nodeHashList)) {
			return 0;
		}
		$this->nodeTotalNum = count($this->nodeHashList);
		return $this->binaryChopIndex(0, $this->nodeTotalNum);
	}

	private function binaryChopIndex($l=0, $r=0)
	{
		if ($l < $r) {
			$avg = intval(($l+$r) / 2);
			if ($this->nodeHashList[$avg] == $this->keyHash) {
				return $avg;
			} elseif ($this->keyHash < $this->nodeHashList[$avg] && ($avg > 0)) {
				return $this->binaryChopIndex($l, $avg-1);
			} else {
				return $this->binaryChopIndex($avg+1, $r);
			}
		} else {
			return $l;
		}
	}

	public function getServersByKey($key, $num=1)
	{
		$index = $this->getNodeIndex($key);
		$server = $this->nodeList[$this->nodeHashList[$index]];
		if ($num == 1) {
			return $server[0];
		}
		if ($num >= count($this->servers)) {
			$num = count($this->servers);
		}
		$result = array($server[0]);
		for ($i=$index+1; true; $i++) {
			if ($i >= $this->nodeTotalNum) {
				$i = 0;
			}
			$nextServer = $this->nodeList[$this->nodeHashList[$i]];
			if (!in_array($nextServer[0], $result)) {
				$result[] = $nextServer[0];
			}
			if (count($result) == $num) {
				break;
			}
		}
		return $result;
	}
}



//示例
$servers = array(
	'127.0.0.1:11211',
	'127.0.0.1:11212',
	'127.0.0.1:11213',
	'127.0.0.1:11214',
	'127.0.0.1:11215'
);
$obj = new HashRing($servers);
$servers = $obj->getServersByKey('testkey', 2);
print_r($servers);
echo "\n";

Redis一致性hash(php版)

一致性hash的使用在PHP中有三种选择分别是原生的memcache扩展,memcached扩展,还有一个是网上比较流行的flexihash类。前两者都适用于memcache但不适合Redis。 p...
  • e421083458
  • e421083458
  • 2015年03月16日 15:40
  • 4130

一致性哈希算法以及其PHP实现

一个好名字是成功的一半,我们希望好名子有如下标准:      第一:要容易记忆朗朗上口   第二:要标明网站的中心思想  第三:要健康而寓意丰富  针对以上三个方面的特点,我认为如果能站在以下五个方面...
  • 21aspnet
  • 21aspnet
  • 2010年08月01日 14:26
  • 15070

字符串哈希函数算法的PHP 实现

恩...或许还有朋友不清楚字符串的哈希函数到底有什么用,这个用处呢,就是将字符串转换成数字,同时让所得数字尽量平均的分布在容器中,换句话说就是让字符串得到相同数字这种情况尽可能少的出现。当然咯...容...
  • guoguo1980
  • guoguo1980
  • 2008年01月04日 14:08
  • 3434

PHP实现一致性hash

随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis...
  • jt521xlg
  • jt521xlg
  • 2015年10月23日 14:27
  • 3655

php实现hash值计算(浅谈php的高精度计算)

最近使用php实现一个hash算法,问题和解决方法如下: 1、php只支持有符号整数,需要自己进行有符号数与无符号数的转换。 正整数(64位)存储的是对应数值,负数存储为对应数值补码。 fu...
  • Shijun_Zhang
  • Shijun_Zhang
  • 2012年03月15日 01:06
  • 3487

PHP实现一致性hash

随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis...
  • jt521xlg
  • jt521xlg
  • 2015年10月23日 14:27
  • 3655

memcache 的内存管理介绍和 php实现memcache一致性哈希分布式算法

1 网络IO模型        安装memcached需要先安装libevent   Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接...
  • lashou_tech
  • lashou_tech
  • 2016年07月23日 15:26
  • 1708

三分钟看懂一致性哈希算法

受一篇“五分钟看懂”的启发,来个哗众取宠的标题 一致性哈希算法,作为分布式计算的数据分配参考,比传统的取模,划段都好很多。 在电信计费中,可以作为多台消息接口机和在线计费主机的分配算法,根据ses...
  • gerryke
  • gerryke
  • 2016年12月30日 09:25
  • 3887

一致性哈希算法与Java实现

一致性哈希算法与Java实现 ======================================================== 一致性哈希算法是分布式系统中常用的算法。比如,一...
  • u010558660
  • u010558660
  • 2016年10月09日 16:07
  • 2220

一致性Hash算法的深入理解

一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中”一致性Hash算法”部分,对于为什么要使用一致性Hash算法、一致性Hash算...
  • u010412301
  • u010412301
  • 2016年09月05日 16:35
  • 5797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[php]对服务器进行一致性hash分布算法
举报原因:
原因补充:

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