php一致性hash性能测试(flexihash/memcache/memcached)
一致性hash的使用在PHP中有三种选择分别是原生的memcache扩展,memcached扩展,还有一个是网上比较流行的flexihash类。
最近有项目需要使用flexihash类操作memcacheq,想看看,单纯使用php的flexihash一致性hash,分布均匀程度,性能差多少。
php一致性hash类下载地址:http://code.google.com/p/flexihash/
测试环境:I7 四核 LINUX FEDORA 使用linux英文词库作为测试用例 memcached开启4个线程
测试结果:
其中,单节点指的是,在只有一个节点工作情况下的,测试结果。
小结
如上所示,就memcache扩展与memcached扩展比较来看,在当全部节点工作正常 的时候,测试条件memcached略快,但基本可以忽略不计。当只有单节点正常工作的时候,memcached扩展性能比 memcache快,我想可能是因为,memcached扩展在检测到连接无效的时候,没有再进行连接测试,直接将数据hash到连接有效的节点。当然这 个只是猜测,需要看源码才能理解。
48万条数据操作,使用flexihash做一致性hash与使用扩展一致性hash,在 hash这个过程中,速度仍旧在一个数量级上,大约是使用扩展速度的一半,其效率可以接受。在分布均匀性上,两个扩展分布基本比较均匀,在使用 flexihash不使用虚拟节点时候,分布非常不均匀,在使用16个虚拟节点后,分布均匀性已经接近扩展了。在使用虚拟节点后, set速度相比较没使用时候略慢,get操作反而变快。
下面给出测试源码
flexihash一致性hash测试
require_once 'flexihash.php';
Class FMemcache { public $hash = null;
public $memcache = null;
public $connectPool = null; public function __construct() {
$this - >hash = new Flexihash();
} public function addServers($servers) {
foreach($servers as $server) {
$node = $server['host'].':'.$server['port'];
$this - >connectPool[$node] = false;
$targets[] = $node;
}
$this - >hash - >addTargets($targets);
} public function set($key, $value) {
$nodes = $this - >hash - >lookupList($key, count($this - >connectPool));
foreach($nodes as $node) {
if (!$this - >connectPool[$node]) {
$server = explode(':', $node);
$this - >connectPool[$node] = @memcache_connect($server[0], $server[1]);
}
if ($this - >connectPool[$node]) {
if (memcache_set($this - >connectPool[$node], $key, $value)) {
return true;
}
}
}
return false;
} public function get($key) {
$nodes = $this - >hash - >lookupList($key, count($this - >connectPool));
foreach($nodes as $node) {
if (!$this - >connectPool[$node]) {
$server = explode(':', $node);
$this - >connectPool[$node] = @memcache_connect($server[0], $server[1]);
}
if ($this - >connectPool[$node]) {
if (memcache_get($this - >connectPool[$node], $key)) {
return true;
}
}
}
return false;
} }
测试示例:
require_once 'flexihash_memcache.php';
require_once 'Config.php';
$st = microtime( true );
$mem = new FMemcache();
$mem->addServers( $tt_server_pool );
$wordAmount = 0;
$getCount = 0;
foreach ($words as $word)
{
if (empty( $word ))
{
continue;
}
$inc = $mem->set( $word, $word );
}
$et = microtime( true ) - $st;
echo "time used:" . $et;
php一致性hash性能测试(flexihash/memcache/memcached)的更多相关文章
- memcache的一致性hash算法使用
一.概述 1.我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的k ...
- Nginx+Memcache+一致性hash算法 实现页面分布式缓存(转)
网站响应速度优化包括集群架构中很多方面的瓶颈因素,这里所说的将页面静态化.实现分布式高速缓存就是其中的一个很好的解决方案... 1)先来看看Nginx负载均衡 Nginx负载均衡依赖自带的 ngx_h ...
- memcached 一致性hash原理
memcache 是一个分布式的缓存系统,但是本身没有提供集群功能,在大型应用的情况下容易成为瓶颈.但是客户端这个时候可以自由扩展,分两阶段实现.第一阶段:key 要先根据一定的算法映射到一台memc ...
- 一致性hash算法在memcached中的使用
一.概述 1.我们的memcacheclient(这里我看的spymemcache的源代码).使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同.仅仅是对我们要存 ...
- 分布式缓存技术memcached学习(四)—— 一致性hash算法原理
分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...
- memcache分布式 [一致性hash算法] 的php实现
最近在看一些分布式方面的文章,所以就用php实现一致性hash来练练手,以前一般用的是最原始的hash取模做分布式,当生产过程中添加或删除一台memcache都会造成数据的全部失效,一致性hash就是 ...
- 一致性Hash算法在Memcached中的应用
前言 大家应该都知道Memcached要想实现分布式只能在客户端来完成,目前比较流行的是通过一致性hash算法来实现.常规的方法是将server的hash值与server的总台数进行求余,即hash% ...
- memcache的一致性hash算法
<?php /** * 一致性哈希memcache分布式,采用的是虚拟节点的方式解决分布均匀性问题,查找节点采用二分法快速查找 * the last known user to change t ...
- 分布式缓存技术memcached学习系列(四)—— 一致性hash算法原理
分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前, ...
随机推荐
- Javascript正则中的exec和match
分几种情况说明 1.假设re中不是全局的也就是不带g var str = "cat3 hat4"; var re = /\w+\d/; var ex = re.exec(str); ...
- setTimeout 传递的方法
function waitExe(param){ if(time < 20){ time ++; $("#content").html(time); var self=thi ...
- rails用generate为两个模型创建has_and_belongs_to_many中间表
假设 teachers和students具备many-to-many的关系,那么需要一个Join 表,has_and_belongs_to_many默认该表名字为teachers_students,这 ...
- axios基于常见业务场景的二次封装
axios axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在前端框架中的应用也是特别广泛,不管是vue还是react,都有很多项目用axios作为网络 ...
- Android系统设置Android adb 开关的方法【转】
本文转载自:http://www.wxtlife.com/2015/11/24/Android-set-adb-status/ 想第一时间获取我的最新文章,请关注公众号: 技术特工队 在整机系统开发中 ...
- SVN命令使用详解【转】
本文转载自:http://blog.sina.com.cn/s/blog_963453200101eiuq.html 1.检出svn co http://路径(目录或文件的全路径) [本地目录全路 ...
- 字典树(Trie树) C++实现
说明: 以下代码是个人按照自己的理解写的,可能有错误或者不太规范的地方,欢迎指出! 代码如下: //插入.删除.查询.遍历四种操作 //注意:四种操作的函数实现中,T都是指向上一个结点的指针,以此方便 ...
- Navicat——如何导出所有的查询数据
前言 很简单就是通过Navicat的查询来查询~ 步骤 真的不要太简单了~ 打开Navicat并点击查询 新建查询 选择对应的连接和库 写入SQL并运行 导出结果 1.选择导出当前的结果 2.选择保存 ...
- 第四届蓝桥杯C++B组省赛
1.高斯日记 2.马虎的算式 3.第39级台阶 4.黄金连分数 5.前缀判断 6.三部排序 7.错误票据 8.翻硬币 9.带分数 10.连号区间数
- 出现Insufficient space for shared memory file错误解决
今天在linux下敲命令,出现上面的错误,原来是临时文件目录(/tmp)下的空间不够了,df一看/下100%了.