`
moqiang02
  • 浏览: 529508 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

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;


分享到:
评论

相关推荐

    memcache分布式一致性hash

    如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中,哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区

    一致性Hash简单实现

    简单模拟实现一致性Hash,透过虚拟节点映射至实际结点,解决一致性Hash的单调性和平衡性问题。

    flexihash:Flexihash是一个小型PHP库,实现了一致的哈希

    composer require flexihash/flexihash 或在您的composer.json { " require " : { " flexihash/flexihash " : " ^3.0.0 " } } 用法 $ hash = new Flexihash (); // bulk add $ hash -> addTargets ([ 'cache-1' ...

    一致性哈希算法源码 Ketama一致性hash算法源码

    Ketama算法是一致性hash算法的一个优秀实现。增删节点后数据命中率及均分率都很高。

    C/C++ 一致性hash算法

    一致性hash算法

    一致性 hash 算法

    一致性 hash 算法介绍

    C++实现一致性hash算法

    一致性hash应用于负载均衡算法,本实现由C++语言开发。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、平衡性(Balance)2、单调性(Monotonicity) 3、分散性(Spread)4、负载(Load)

    IT面试-一致性Hash算法,也成一致性cache算法

    IT面试常见的题目,对于分布式存储系统中常碰到的故障问题,如何解决,就是采用一致性hash算法

    一致性hash的PHP库.zip

    }Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的...

    一致性hashjava实现

    别人写的一个一致性hash的java实现,分享下

    一致性Hash算法的原理及实现

    一致性Hash算法的原理及实现

    Flexihash(java版)

    Flexihash简化版,hash算法(java版),一致性hash的使用在PHP中有三种选择分别是原生的memcache扩展,memcached扩展,还有一个是网上比较流行的flexihash类。前两者都适用于memcache但不适合Redis

    一致性哈希(php版)

    一致性哈希算法的php版,希望能帮到phper了解一致性哈希

    memcache一致性hash的php实现方法

    本文实例讲述了memcache一致性hash的php实现方法。分享给大家供大家参考。具体如下: 最近在看一些分布式方面的文章,所以就用php实现一致性hash来练练手,以前一般用的是最原始的hash取模做 分布式,当生产过程中...

    基于 Canal 的 MySql RabbitMQ Redis/memcached/mongodb

    数据:mysql->binlog->MQ->redis(不过期、关闭RDB、AOF保证读写性能) (nosql数据仅用crontab脚本维护) 请求:http->webserver->redis(有数据)->返回数据 (完全避免用户直接读取mysql) ->redis(无数据)->返回...

    flexihash-hash的PHP库.zip

    namespace Flexihash\Hasher; /**  * Uses CRC32 to hash a value into a signed 32bit int address space.  * Under 32bit PHP this (safely) overflows into negatives ints.  * ...

    libconhash一致性hash

    很好用的C一致性hash库

    webqq hash算法c#版(20160218)

    webqq最新hash算法c#版,20160218完成,由webqq的js算法翻译而来。 计算结果完全一致,请放心使用。 /// /// QQ hash算法 /// </summary> /// <param name="b">QQ号</param> /// <param name="j">cookie的ptwebqq值...

    PHP实现的一致性Hash算法详解【分布式算法】

    主要介绍了PHP实现的一致性Hash算法,结合实例形式详细分析了php一致性Hash算法的概念、原理及相关实现与使用技巧,需要的朋友可以参考下

    计算机后端-PHP视频教程. Memcached17 PHP实现一次性hash.wmv

    计算机后端-PHP视频教程. Memcached17 PHP实现一次性hash.wmv

Global site tag (gtag.js) - Google Analytics