Memcached 之取模与哈希算法命中率实验
当5台memcache服务器中有一台宕机时的命中率实验。
一、php实现代码
1. config.php
$server = array(
"A" => array("host" => "127.0.0.1", "port" => 11211),
"B" => array("host" => "127.0.0.1", "port" => 11212),
"C" => array("host" => "127.0.0.1", "port" => 11213),
"D" => array("host" => "127.0.0.1", "port" => 11214),
"E" => array("host" => "127.0.0.1", "port" => 11215),
); $_dis = "Moder";//Consistent
2. hash.php
interface hasher {public function _hash($str);}
interface distribution {public function lookup($key);}
/**
* 取模算法类
*/
class Moder implements hasher,distribution
{
protected $_nodes = array();
protected $_cnt = 0;
public function _hash($str) {
return sprintf('%u',crc32($str)); // 把字符串转成 32 位符号整数
}
public function addNode($node){
if (in_array($node, $this->_nodes)) {
return true;
}
$this->_nodes[] = $node;
$this->_cnt += 1;
return true;
}
public function delNode($node) {
if (!in_array($node, $this->_nodes)) {
return true;
}
$key = array_search($node, $this->_nodes);
unset($this->_nodes[$key]);
$this->_cnt -= 1;
return true;
}
public function lookup($key) {
$key = $this->_hash($key) % $this->_cnt;
return $this->_nodes[$key];
}
public function printNodes()
{
print_r($this->_nodes);
}
}
/*
$mode = new Moder();
$mode->addNode('a');
$mode->addNode('b');
$mode->addNode('c');
$key = "sssa";
$mode->printNodes();
echo $mode->_hash($key)."<br/>";
echo $mode->lookup($key);
*/
/**
* 一致性hash算法类
*/
class Consistent implements hasher,distribution{
protected $_nodes = array(); //服务器节点
protected $_postion = array();//虚拟节点
protected $_mul = 64; //每个节点对应 64 个虚节点
public function _hash($str) {
return sprintf('%u',crc32($str)); // 把字符串转成 32 位符号整数
}
// 核心功能
public function lookup($key) {
$point = $this->_hash($key);
$node = current($this->_postion); //先取圆环上最小的一个节点,当成结果
foreach($this->_postion as $k=>$v) {
if($point <= $k)
{
$node = $v;
break;
}
}
reset($this->_postion);
return $node;
}
//添加节点
public function addNode($node) {
if(isset($this->nodes[$node])) {
return;
}
for($i=0; $i<$this->_mul; $i++) {
$pos = $this->_hash($node . '-' . $i);
$this->_postion[$pos] = $node;
$this->_nodes[$node][] = $pos;
}
$this->_sortPos();
}
// 循环所有的虚节点,谁的值==指定的真实节点 ,就把他删掉
public function delNode($node) {
if(!isset($this->_nodes[$node])) {
return;
}
foreach($this->_nodes[$node] as $k) {
unset($this->_postion[$k]);
}
unset($this->_nodes[$node]);
}
//将虚拟节点排序
protected function _sortPos() {
ksort($this->_postion,SORT_REGULAR);
}
}
/*
// 测试
$con = new Consistent();
$con->addNode('a');
$con->addNode('b');
$con->addNode('c');
$key = 'www.zixue.it';
echo '此 key 落在'.$con->lookup($key).'号节点';
*/
3.initData.php(初始化数据)
include './config.php';
include './hash.php';
set_time_limit(0);
$mem = new Memcache();
$diser = new $_dis();
foreach ($server as $key => $value) {
$diser->addNode($key);
}
for ($i=0; $i < 1000; $i++) {
//获取服务器
$serv = $server[$diser->lookup("key" . $i)];
$mem->connect($serv['host'], $serv['port'], 2);
$mem->add("key".$i, "value".$i, 0, 0);
} echo "full";
4.load.php (获取数据的概率)
include './config.php';
include './hash.php';
set_time_limit(0);
$mem = new Memcache();
$diser = new $_dis();
foreach ($server as $key => $value) {
$diser->addNode($key);
}
for ($i=0; $i < 1000; $i++) {
//获取服务器
$serv = $server[$diser->lookup("key" . $i)];
$mem->connect($serv['host'], $serv['port'], 2);
$mem->add("key".$i, "value".$i, 0, 0);
} echo "full";
5.exec.php (执行)
//模拟减少一台服务器
include './config.php';
include './hash.php'; $mem = new Memcache();
$diser = new $_dis();
foreach ($server as $key => $value) {
$diser->addNode($key);
} //删除一台服务器
$diser->delNode("D"); for ($i=0; $i < 10000; $i++) {
//获取服务器
$serv = $server[$diser->lookup("key" . $i)];
if ($serv) {
$mem->connect($serv['host'], $serv['port'], 2);
if(!$mem->get("key" . $i)){
$mem->add("key".$i, "value".$i, 0, 0);
}
} usleep(3000);
}
二、取模算法命中率
如图:
1.初始状态:

2.过程中状态:


3.结束状态

三、哈希算法命中率
如图:
1.初始状态:

2.过程中:

3.结束状态:

三、总结
1.取模命中率为20%(1 / N),哈希命中率为80%左右((N - 1) / N)。
2.当 memcached 节点越多时,一致性哈希算法对缓存的命中率比取模算法对缓存的命中率要高很多。
Memcached 之取模与哈希算法命中率实验的更多相关文章
- memcached集群和一致性哈希算法
场景 由于memcached集群各节点之间都是独立的,互不通信,集群的负载均衡是基于客户端来实现的,因此需要客户端用户设计实现负载均衡算法. 取模算法 N个节点,从0->N-1编号,key对N ...
- 09 Memcached 分布式之取模算法的缺陷
一: Memcached 分布式之取模算法的缺陷(1)假设你有8台服务器,运行中突然down一台,则求余数的底数就7. 后果: key_0%8==0 ,key_0%7==0 =>hist(命中) ...
- Memcached 笔记与总结(8)Memcached 的普通哈希分布算法和一致性哈希分布算法命中率对比
准备工作: ① 配置文件 config.php ② 封装 Memcached 类 hash.class.php,包含普通哈希算法(取模)和一致性哈希算法 ③ 初始化 Memcached 节点信息 in ...
- memcached 一致性哈希算法
本文转载自:http://blog.csdn.net/kongqz/article/details/6695417 一.概述 1.我们的memcache客户端使用了一致性hash算法ketama进行数 ...
- memcached分布式一致性哈希算法
<span style="font-family: FangSong_GB2312; background-color: rgb(255, 255, 255);">如果 ...
- 【转】C语言快速幂取模算法小结
(转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速 ...
- Raising Modulo Numbers_快速幂取模算法
Description People are different. Some secretly read magazines full of interesting girls' pictures, ...
- 位运算之——按位与(&)操作——(快速取模算法)
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
- 【Java基础】14、位运算之——按位与(&)操作——(快速取模算法)
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
随机推荐
- [Poj2112][USACO2003 US OPEN] Optimal Milking [网络流,最大流][Dinic+当前弧优化]
题意:有K个挤奶机编号1~K,有C只奶牛编号(K+1)~(C+K),每个挤奶机之多能挤M头牛,现在让奶牛走到挤奶机处,求奶牛所走的最长的一条边至少是多少. 题解:从起点向挤奶机连边,容量为M,从挤奶机 ...
- 查看当前Java进程工具jps(转)
jps是JDK提供的一个查看当前Java进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写.非常简单实用. 命令格式: jps [optio ...
- Clojure:通过cursive连接远程REPL服务器
配置很简单,步骤如下:1. 选择Edit Configurations…2. 选择Clojure REPL -> Remote3. 输入远程服务器的ip和端口. 最后点运行就可 ...
- HDU 5293
树上DP题. 其实有点类似于01的问题.方程很容易想到.首先,因为一条链的节点其实都是在树上的,所以很容易想到应该先求一个LCA.然后,当某节点不是链的LCA时,它的转移就是: dp[i]=sum[i ...
- jquery easyui datagrid实现数据改动
1.单击选中待改动行 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA= ...
- TRIZ的成功案例
这篇採訪稿是几年前的,是TRIZ成功案例离我近期的,由于主人公是我的朋友,请点击查看: 培训后技术难题就攻克了 后记:学了TRIZ并不能让您100%解决您全部遇到的问题,但这样的思想和方法确实是最具操 ...
- apache storm 的安装
原文: http://storm.praveendeshmane.co.in/storm/storm-0-10-0-installation-on-ubuntu-14-04.jsp --------- ...
- c++ 11 thread 初试
最新的 c++11标准整合进了 线程支持.以下写一个小程序測试一下. 測试代码: #include <iostream> #include <thread> void hell ...
- bzoj5192: [Usaco2018 Feb]New Barns
不想写看zory大佬 #include<cstdio> #include<iostream> #include<cstring> #include<cstdl ...
- 背包问题的方案总数 P1474 货币系统
背包问题的方案总数 对于一个给定了背包容量.物品费用.物品间相互关系(分组.依赖等)的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得到装满背包或将背包装至某一指定容量的方案总数. ...