参考文章

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. Android使用ListView应该注意的地方

    在ListView中设置Selector为null会报空指针? mListView.setSelector(null);//空指针 试试下面这种: mListView.setSelector(new ...

  2. Makefile拆分编写

    在实际开发项目中,我们通常将一个工程划分为多个文件夹,每个文件夹代表不能的功能,如:我的一个项目cpl,它分为两个文件夹:src和test.当在cpl文件夹中运行make的时候,它的一级目录都会自动运 ...

  3. 添加jre/jdk A java Exception occurred

  4. QML Image: Cannot open: qrc:///new.pic.png

    初次遇到这个问题真有点摸不着头脑,于是乎百度一下咯,但是百度一向没有什么用,该有的没有,没用的回答倒是有特么一大堆. 自己解决: 我的解决方法很简答: 第一步:把图片放到当前路径下,也就是和.pro一 ...

  5. ecshop后台分页浅析

      既然是分页,道理都是一样的,不过ecshop前台分页的函数和后台分页的函数不同,后台分页函数为page_and_size(),在admin/includes/lib_main.php里.都是用aj ...

  6. SVN-Server搭建及配置

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...

  7. job history 的查看

    linux shell 可以启动 mapred historyserver 然后根据显示的端口hostname+port进行访问(一般默认端口是19888)

  8. WEKA运行LIBSVM出现problem evaluating classifier:rand

    原来这个实验已经做了的.也出现了些问题,但是上网找到了解决方法,那个时候是完成数据挖掘的课程论文,用WEKA运行LIBSVM,也没有很深入,简单跑出结果就算了. 这次想着研讨会就讲这个,想着深入进去, ...

  9. 64位系统里的IIS运行32位ODP.NET的方法

    在64位Win7里的IIS里部署使用了ODP.NET的网站,Oracle的版本是11.20.3.20.直接部署会提示错误:在64位环境里使用了32位的程序.自己折腾了两天,最后才从别人的博客里找到解决 ...

  10. 用Linq操作数据小记

    小记 public void UpdateWarhouse(Administrator admin) { var warhouseStr = Request["warhouse"] ...