参考文章

http://blog.chinaunix.net/uid-20498361-id-4303232.html

http://blog.csdn.net/kongqz/article/details/6695417

https://my.oschina.net/goal/blog/203593?p=1

一直认为一致性hash是个很神奇的东东,技术大牛的想法果然不同凡响。

下列代码并没有作优化处理,仅供参考理解ketama算法,当然也有助于自己理解记忆。如果有错误的地方欢迎指出

 function addServer($hostName = array()){
$serverList = array();
foreach($hostName as $val) {
for($i = 0;$i<40;$i++) {
$digest = md5($val.'_'.$i, true);
for ($h = 0; $h < 4; $h++) {
$hash = (ord($digest[3 + $h * 4]) << 24) | (ord($digest[2 + $h * 4]) << 16)
| (ord($digest[1 + $h * 4]) << 8) | ord($digest[$h * 4]);
$serverList[$val][$i*4+$h] = $hash;
}
}
}
return $serverList;
}
//md5的原因是怕用户输入前缀一致 hash一样 分布不均匀??
function getKeyHash($str){
$digest = md5($str,1);
return (ord($digest[3])<<24) | (ord($digest[2])<<16) | (ord($digest[3])<<8) | (ord($digest[0]));
} function findKey($str){
$hostName = array(
'10.100.20.1',
'10.100.20.2',
'10.100.20.3',
'10.100.20.4',
'10.100.20.5',
'10.100.20.6',
);
$serverList = addServer($hostName);
$serverHash = array();
foreach($serverList as $server){
$serverHash = array_merge($serverHash,$server);
}
sort($serverHash);
$i = 0;
$len = count($serverHash);
$keyHash = getKeyHash($str);
if($keyHash>$serverHash[$len-1]){
foreach($serverList as $key=>$val){
if(in_array($serverHash[$len-1],$val)){
return $key;
}
}
return 0;
}
while($i<$len){
$curr = $serverHash[$i];
$next = $serverHash[++$i];
if($next>=$keyHash && $keyHash>=$curr){
foreach($serverList as $key=>$val){
if(in_array($serverHash[$i],$val)){
return $key;
}
}
}
}
return false;
}
$result = array();
for($i=1;$i<1000;$i++){
$tmp = findKey('key'.$i);
if(isset($result[$tmp])){
$result[$tmp]++;
}else{
$result[$tmp] = 0;
}
}
print_r($result);

上面输出结果如下,所以说该算法分布还是相当均匀的。

[root@silence suanfa]# php ketama.php
Array
(
[10.100.20.6] => 149
[10.100.20.5] => 162
[10.100.20.4] => 171
[10.100.20.2] => 146
[10.100.20.3] => 196
[10.100.20.1] => 169
)

查找键值所在服务器可以采用下列折半的方式

 $rangeArr =
array (
0 => 19,
1 => 99,
2 => 47,
3 => 49,
4 => 74,
5 => 77,
6 => 45,
7 => 95,
8 => 87,
9 => 15,
10 => 14,
11 => 29,
12 => 57,
13 => 3,
14 => 8,
15 => 38,
16 => 28,
17 => 67,
18 => 55,
19 => 43,
20 => 5,
21 => 25,
22 => 48,
23 => 32,
24 => 58,
25 => 90,
26 => 27,
27 => 50,
28 => 6,
29 => 63,
30 => 65,
31 => 81,
32 => 51,
33 => 52,
34 => 66,
35 => 30,
36 => 56,
37 => 54,
38 => 86,
39 => 84,
40 => 83,
41 => 64,
42 => 42,
43 => 26,
44 => 46,
45 => 79,
46 => 69,
47 => 98,
48 => 24,
49 => 37,
);
sort($rangeArr);
function findPoint($num,$rangeArr){
$len = count($rangeArr);
if($num> $rangeArr[$len-1] || $num<$rangeArr[0]){
return $num.'in'.$rangeArr[0];
}
if($len == 2){
return $num.'in'.$rangeArr[1];
}
if($len == 1){
return $num.'in'.$rangeArr[0];
}
$half =(int)floor($len/2);
if($num<$rangeArr[$half]){
$tmp = array_slice($rangeArr,0,$half+1);
return findPoint($num,$tmp);
}else{
$tmp = array_slice($rangeArr,$half,$len-$half);
return findPoint($num,$tmp);
}
}
echo findPoint(4,$rangeArr);exit;

关于Memcached一致性hash的探究的更多相关文章

  1. memcached 一致性hash原理

    memcache 是一个分布式的缓存系统,但是本身没有提供集群功能,在大型应用的情况下容易成为瓶颈.但是客户端这个时候可以自由扩展,分两阶段实现.第一阶段:key 要先根据一定的算法映射到一台memc ...

  2. Memcached 之PHP实现服务器集群一致性hash算法

    /** * memcached 一致性hash,分布式算法 * Class MemcacheCluster */ class MemcacheCluster { protected $nodes = ...

  3. 关于一致性Hash算法

    在大型web应用中,缓存可算是当今的一个标准开发配置了.在大规模的缓存应用中,应运而生了分布式缓存系统.分布式缓存系统的基本原理,大家也有所耳闻.key-value如何均匀的分散到集群中?说到此,最常 ...

  4. 分布式缓存技术memcached学习(四)—— 一致性hash算法原理

    分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...

  5. 一致性Hash算法在Memcached中的应用

    前言 大家应该都知道Memcached要想实现分布式只能在客户端来完成,目前比较流行的是通过一致性hash算法来实现.常规的方法是将server的hash值与server的总台数进行求余,即hash% ...

  6. 分布式缓存技术memcached学习系列(四)—— 一致性hash算法原理

    分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前, ...

  7. (转) 一致性Hash算法在Memcached中的应用

    前言 大家应该都知道Memcached要想实现分布式只能在客户端来完成,目前比较流行的是通过一致性hash算法来实现.常规的方法是将 server的hash值与server的总台数进行求余,即hash ...

  8. memcached和一致性hash算法

    1 一致性hash算法的一致性 这里的一致性指的是该算法可以保持memcached和数据库中的数据的一致性. 2 什么是一致性hash算法 2.1 为什么需要一致性hash算法 现在有大量的key v ...

  9. 转: memcached Java客户端spymemcached的一致性Hash算法

    转自:http://colobu.com/2015/04/13/consistent-hash-algorithm-in-java-memcached-client/ memcached Java客户 ...

随机推荐

  1. Web Form 和asp.net mvc 差别

    Asp.net MVC 和web Form的基本区别 Web Form ASP.NET MVC 视图和逻辑紧密耦合 视图和逻辑分离 页面(给予文件的URL) 控制器(基于路由的URL) 状态管理(视图 ...

  2. /date(-62135596800000)转换正常格式的时间

    function formatDatebox(value) { if (value == null || value == '') { return ''; } var dt = parseToDat ...

  3. css3-实现3D立方体旋转

    核心内容: 1.CSS3 中 animation.perspective 属性的熟练运用. 2.CSS3 中的变形属性 transform,在 3D 立体效果中的运用. 3.3D 立方体旋转实现原理. ...

  4. C语言内存分区

    在C/C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.     栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变 ...

  5. sql developer 要求输入jdk地址

    困扰了好久  终于找到解决办法了. 将sql developer改为 兼容模式和管理员方式运行,选择java.exe的路径 终于可以在64位系统下顺利使用了.

  6. MVC+UnitOfWork+Repository+EF 之我见

    UnitOfWork+Repository模式简介: 每次提交数据库都会打开一个连接,造成结果是:多个连接无法共用一个数据库级别的事务,也就无法保证数据的原子性.一致性.解决办法是:在Reposito ...

  7. jQuery设置元素attribute之特殊属性

    一般我们使用.attr()对某个dom元素设置attribute属性.今天在使用过程中发现在给input设置disabled属性为true时,最终元素disabled属性值解析成了disabled,并 ...

  8. [转] LBYL与EAFP两种防御性编程风格

    检查数据可以让程序更健壮,用术语来说就是防御性编程.检查数据的时候,有这样的两种不同的风格.LBYL:Look Before You Leap  EAFP:Easier to Ask Forgiven ...

  9. oracle 多条语句同时执行(比如返回两个dataset)

    public DataSet GetQualityStatistics(DateTime start_date,DateTime end_date,string modality,string hos ...

  10. js的事件委托

    什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事 ...