PHP一致性hash的实现
2015-01-08 19:22
330 查看
本文是剽窃了Flexihash的实现,不是本人所为,简化了实现的细节 http://code.google.com/p/flexihash/ 一致性hash大多用于缓存集群中,为了使在缓存中由于一台或多台服务器宕机,导致后端数据库压力过大而崩溃,他对添加和减少缓存服务器迁移的数据量最小化,相对于取模来说 对于一致性hash的原理和介绍,网上有很多,我这里就不转帖了 <?php /** * Consisten Hashing * */ class ConsistenHash { private $_targetNum = 0; //值越大,分布在环上的数据就越均匀 private $_replicas = 64; private $_targetToPositions = array(); private $_positionsToTargets = array(); public function __construct($replicas = null){ if(!empty($replicas)) $this->_replicas = $replicas; } //添加单个目标 public function addTarget($target){ //如果target为空则返回false if(empty($target)) return false; //如果target存在则返回 if(array_key_exists($target,$this->_targetToPositions)) return $this; for($i=0;$i<$this->_replicas;$i++){ $position = $this->hash($target.$i); $this->_positionsToTargets[$position] = $target; $this->_targetToPositions[$target][] = $position; } $this->_targetNum++; //ksort($this->_positionsToTargets,SORT_REGULAR); } //批量添加目标对象,在分布式缓存中为缓存服务器,如果在分表中,则为表名列表 public function addTargets($targets){ if(is_array($targets)){ foreach($targets as $target){ $this->addTarget($target); } }else{ $this->addTarget($target); } return $this; } //获取目标对应的位置对象 public function getTarget($id){ if(empty($id)) return array(); if($this->_targetNum == 1) return array_unique(array_values($this->_positionToTarget)); $position = $this->hash($id); ksort($this->_positionsToTargets,SORT_REGULAR); foreach($this->_positionsToTargets as $k=>$v){ if($k > $position){ return $v; } } } //获取所有位置与目标对象列表 public function getAllList($flag = null){ if(empty($flag)) { return $this->_targetToPositions; 4000 } ksort($this->_positionsToTargets,SORT_REGULAR); return $this->_positionsToTargets; } //通过crc32计算target和key的值 public function hash($target){ $hash = sprintf("%u",crc32($target)); return $hash; } } ?> 以下是测试用的code: <?php require_once "consisten_hash.class.php"; $hash = new ConsistenHash(8); $hash->addTargets(array('cache-001','cache-002','cache-003','cache-004')); print_r($hash->getAllList(true)); $position = $hash->hash('abc'); $target = $hash->getTarget('abc'); echo $position."\n"; echo $target."\n"; ?>
相关文章推荐
- PHP实现的服务器一致性hash分布算法示例
- PHP实现一致性hash
- PHP一致性hash的实现
- 使用JAVA实现PHP中hash_hmac 函数
- Hash哈希(二)一致性Hash(C++实现)
- 深入解析ThinkPHP框架关联模型实现(用PHP如何确保事务一致性)
- php实现的geohash
- TrafficServer一致性hash实现
- 【转载】memcache分布式 [一致性hash算法] 的php实现
- memcache分布式 [一致性hash算法] 的php实现
- 一致性hash 之 C++实现
- memcache一致性hash的php实现方法
- PHP中用hash实现的数组
- memcache一致性hash的php实现方法
- memcache一致性hash的php实现方法
- TrafficServer一致性Hash的实现分析
- php实现hash值计算(浅谈php的高精度计算)
- 一致性hash 原理与实现 (Consistent hashing implemented)
- libmemcached的一致性hash实现源码分析
- C#实现php的hash_hmac函数