PHP 一致性哈希算法的一种简单实现
在分布式系统中,如果某业务可以由多个相同的节点处理,很容易想到用HASH的方式将业务请求分散到这些节点处理,比如memecache缓存等分 布式集群应用,如果只是简单的使用,不涉及用户用户状态等信息,则可以直接采用取模算法。正常情况下,取模算法好像也不错,但是一旦增加节点或者其中一个 节点上宕机的话,命中率将会急剧降低,所以取模算法在这种情况下弊端很明显,为此,在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法。 具体的算法介绍我这里不多少了,需要了解的可以参见本文:http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html
下面贴一个用PHP对其进行的简单实现
class Hash
{
//落点集合,可以缓存起来
private $_locations = array();
//虚拟节点数量
private $virtualNodeNum = 24;
//维护的另一种节点和虚拟节点对应关系,方便删除
private $_nodes;
//将字符串转成数字
private function _hash($str)
{
return sprintf('%u', crc32($str));
} /**
* 寻找字符串所在的机器位置
* @param $str
* @return bool|mixed
*/
public function getLocation($str)
{
if(empty($this->_locations)){
return false;
}else{
$position = $this->_hash($str);
//默认取第一个节点
$node = current($this->_locations);
foreach($this->_locations as $k=>$v){
//如果当前的位置,小于或等于节点组中的一个节点,那么当前位置对应该节点
if($position <= $k){
$node = $v;
break;
}
}
return $node;
}
} /**
* 添加一个节点
* @param $node
*/
public function addNode($node)
{
//生成虚拟节点
for($i=0;$i<$this->virtualNodeNum;$i++){
$tmp = $this->_hash($node.$i);
$this->_locations[$tmp] = $node;
$this->_nodes[$node][] = $tmp;
}
//对节点排序
ksort($this->_locations,SORT_NUMERIC);
} /**
* 删除一个节点
* @param $node
*/
public function deleteNode($node)
{
foreach($this->_nodes[$node] as $v){
unset($this->_locations[$v]);
}
} }
PHP 一致性哈希算法的一种简单实现的更多相关文章
- 一致性哈希算法以及其PHP实现
在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...
- 一致性哈希算法(Consistent Hashing) .
应用场景 这里我先描述一个极其简单的业务场景:用4台Cache服务器缓存所有Object. 那么我将如何把一个Object映射至对应的Cache服务器呢?最简单的方法设置缓存规则:object.has ...
- 五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...
- 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...
- 一致性哈希算法(consistent hashing)【转】
一致性哈希算法 来自:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 ...
- 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据
一致性哈希算法 摘自:http://blog.codinglabs.org/articles/consistent-hashing.html 算法简述 一致性哈希算法(Consistent Hashi ...
- 一致性哈希算法原理及Java实现
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单 ...
- _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决
笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...
- Notes:一致性哈希算法
业务场景: 存在三个专门提供缓存服务的服务器,前端所需要的图片等静态资源被缓存于这三个服务器其中之一. 但是如何提高查找图片的速度呢? 可以采用哈希算法. 常规意义上的哈希算法: 通过hash(图片名 ...
随机推荐
- Fusioncharts图表组件API参考方法(Functions)汇总篇(续)
[摘要]: chartType()FusionCharts的JavaScript类API提供了大量的功能.下面的列表显示在每个功能的详细信息: 一.FusionCharts的类 - 实例功能 1.co ...
- Byte数组和Int的互相转换
public static int bytesToInt(byte[] bytes) { int addr = bytes[0] & 0xFF; addr |= ((bytes[1] < ...
- Dojo和jQuery区别
Dojo类似jQuery,且用法也差不多,但是Dojo属于重量级的框架,自带的表单验证,Grid,tree等控件. 在选择上,个人觉得轻量级的框架比较好,因为方便引入第三方的,有特色的库. 就像选择S ...
- my97datepicker开始日期小于结束日期格式化时间精确届时分秒
my97datepicker开始日期小于结束日期格式化时间精确到时分秒 一 , 需求: 结束时间 > 开始时间, 不符合的时间段不能选择.比如我选择开始日期是7月28,那结束的日期将只能从7月2 ...
- ICE异步程序设计-----AMI/AMD
1 简介 AMI 异步方法调用(AMI) 这个术语描述的是客户端的异步编程模型支持. 如果你使用AMI 发出远地调用,在Ice run time 等待答复的同时,发出调用的线程不会阻塞.相反,发出调用 ...
- html ajax 双引号的问题
"<a onClick='openwin_searchmodel()' href='searchmodel.action?projectname="+person[i].ge ...
- 15个最佳jQuery的翻页书效果的例子
在这里,你会发现15的jQuery的翻页书的插件,提供了良好的页面翻转的经验,并帮助创建类似书本的效果. jQuery的增添了一道亮丽的过渡到实际的页面在一本书或杂志HTML5. 1. BookBlo ...
- implemented loader.php
http://stackoverflow.com/questions/11787176/manage-url-routes-in-own-php-framework This is how i imp ...
- golang中container/list包源码分析
golang源码包中container/list实际上是一个双向链表 提供链表的一些基本操作,下面就结合定义和接口进行下说明 1. 定义 // Element is an element of a l ...
- VI 摘要
1 行首添加注释 1 :5,10s/^/#/g 2 sed '5,10s/^/#/' 2 替换某一个行 文本为 11111 22222 33333 替换: %s/\(.*\)/http:\/\/ ...