php实现一致性哈希算法
<?php//原理概念请看我的上一篇随笔(http://www.cnblogs.com/tujia/p/5416614.html)或直接百度 /** * 接口:hash(哈希插口)、distribution(分布式算法接口) * 方法: * hash * _hash,处理并返回一个字符串的哈希值 * distribution * _lookup:给它一个key,它要反正此key需要存取的目标服务器信息 * * * 一致性哈希分布式算法类:ConsistentHash * 方法: * addServ: 添加服务器 * addPos: 添加”虚拟节点“ * sortPos: 对所有”虚拟节点“进行排序,形成集群圈 * _hash: 实现插口的_hash方法 * _lookup: 实现插口的_lookup方法 * * 测试用方法 * printServ: 打印集群中的服务器列表信息 * printPos: 打印集群中的虚拟节点列表信息 * decServ: 删除一台服务器及他的所有虚拟节点 */ interface hash{ public function _hash($str); } interface distribution{ public function _lookup($key); } /** * 一致性哈希算法类 */ class ConsistentHash implements hash,distribution { protected $mem_serv = array();//服务器列表 protected $node_pos = array();//所有虚拟节点 protected $mul = 64;//第一台服务器弄64个虚拟节点 /** * 添加服务器 * @param array $serv_info 服务器配置信息,格式为:array('host':'127.0.0.1', 'port':11211); */ public function addServ($serv_info){ if(!is_array($serv_info) || !isset($serv_info['host']) || !isset($serv_info['port'])) return false; $str = $serv_info['host'] .':'. $serv_info['port']; $serv_key = $this->_hash($str); //记录服务器信息 $this->mem_serv[$serv_key] = $serv_info; //添加虚拟节点 $this->addPos($serv_key); return true; } /** * 添加虚拟节点 * @param string $serv_key 服务器的key */ protected function addPos($serv_key){ for($i=0; $i<$this->mul; $i++){ $pos = 'node_' . $serv_key . '_' . $i; $pos_hash = $this->_hash($pos); $this->node_pos[$pos_hash] = $serv_key; } $this->sortPos(); return true; } /** * 对所有虚拟节点进行排序 */ protected function sortPos(){ return ksort($this->node_pos); } /** * 对字符串进行hash处理,返回其整数无符号整数值 * @param string $str 要进行处理的字符串 */ public function _hash($str){ return sprintf("%u", crc32($str)); } /** * 通过key计算它的落点服务器信息 * @param string $key 键 */ public function _lookup($key){ $key_hash = $this->_hash($key); $serv_key = key($this->mem_serv); foreach ($this->node_pos as $pos=>$serv) { if($key_hash<=$pos){ $serv_key = $serv; break; } } return $this->mem_serv[$serv_key]; } /** * 以下的方法做为测试用 */ /** * 打印服务器列表 * @return [type] [description] */ public function printServ(){ echo '<pre>'; print_r($this->mem_serv); echo '</pre>'; } public function printPos(){ echo '<pre>'; print_r($this->node_pos); echo '</pre>'; } /** * 删除一个服务器及它的所有虚拟节点 * @param int $serv_key 服务器的hash值 */ public function decServ($serv_key=''){ if(empty($serv_key)) $serv_key = key($this->mem_serv); unset($this->mem_serv[$serv_key]); return true; } } //测试 /*$dis = new ConsistentHash(); $dis->addServ(array('host'=>'127.0.0.1', 'port'=>11211)); $dis->addServ(array('host'=>'127.0.0.1', 'port'=>11212)); $dis->addServ(array('host'=>'127.0.0.1', 'port'=>11213)); $dis->addServ(array('host'=>'127.0.0.1', 'port'=>11214)); $dis->addServ(array('host'=>'127.0.0.1', 'port'=>11215)); $dis->printServ(); $dis->printPos(); print_r($dis->_lookup('name')); print_r($dis->_lookup('age')); print_r($dis->_lookup('sex')); print_r($dis->_lookup('height')); print_r($dis->_lookup('weight'));*/ ?>
php实现一致性哈希算法的更多相关文章
- 一致性哈希算法与Java实现
原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...
- 五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...
- 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...
- 一致性哈希算法以及其PHP实现
在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...
- Java_一致性哈希算法与Java实现
摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...
- 一致性哈希算法(consistent hashing)【转】
一致性哈希算法 来自:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 ...
- 一致性哈希算法学习及JAVA代码实现分析
1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...
- 一致性哈希算法——算法解决的核心问题是当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 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...
随机推荐
- Libevent详细说明
文章来自官方文档的部分翻译:http://www.wangafu.net/~nickm/libevent-book/ 通过这部分的了解,基本上可以使用libevent的常用功能了.有时间建议直接看官方 ...
- Codeforces449A Jzzhu and Chocolate && 449B Jzzhu and Cities
CF挂0了,简直碉堡了.两道题都是正确的思路但是写残了.写个解题报告记录一下心路历程. A题问的是 一个n*m的方块的矩形上切k刀,最小的那一块最大可以是多少.不难发现如果纵向切k1刀,横向切k2刀, ...
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 2(Big Number)
这里的高精度都是要去掉前导0的, 第一题:424 - Integer Inquiry UVA:http://uva.onlinejudge.org/index.php?option=com_onlin ...
- editplus bat语法高亮
editplus bat语法高亮 今天需要在Windows上写批处理,因为没写过,避免关键字错误,就需要语法高亮了,editplus默认没有bat语法文件,赶紧解决. 1:到 http://www.e ...
- ExtJs之Ext.util.MixedCollection
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- div滚动条
给DIV限定宽度或高度,并指定overflow样式为auto,这样当内空超出后就会自动出现滚动条了.如<div style="width:100px; height:100px; ov ...
- GetWindowText和GetDlgItemText的区别
二者使用方法相同,入口点不一样. 举例: CString str; /* if (GetDlgItem(IDC_Number1)->GetWindowText(str),str==" ...
- 执行脚本出现bin/bash: bad interpreter: No such file or directory
-bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory VI打开文件,没发现任何问题, 把/bin/bash ...
- mq_setattr
NAME mq_setattr - 设置消息队列的属性(REALTIME) SYNOPSIS #include <mqueue.h> int mq_setattr(mqd_t mqdes, ...
- iOS开发--xcode快捷键
1. 文件CMD + N: 新文件CMD + SHIFT + N: 新项目CMD + O: 打开CMD + S: 保存CMD+OPt+S:保存所有文件CMD + SHIFT + S: 另存为CMD + ...