cheng029 发表于 2015-11-18 09:03:09

php模块memcache和memcached区别分析

  转自:http://www.iyunv/article/27366.htm
  谈及php搭配memcached使用,已经是老生常谈的问题。但是有一些细节,不见得人人清楚。比如说php的模块memcache和memcached有什么区别等。下面我就简单介绍一下。

  (php模块memcache下载地址:http://pecl.php.net/package/memcache
  php模块memcached下载地址:http://pecl.php.net/package/memcached)
  1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的。与之对应的带d的memcached是建立在libmemcached的基础上,所以相对来说,memcached版本的功能更全一些。
memcache:http://cn2.php.net/manual/en/book.memcache.php
memcached:http://cn2.php.net/manual/en/book.memcached.php
2.Memcache是原生实现的,支持OO和非OO两套接口并存。而memcached是使用libmemcached,只支持OO接口。
3.memcached还有个非常称赞的地方,就是flag不是在操作的时候设置了,而是有了一个统一的setOption()。Memcached实现了更多的memcached协议。
4.memcached支持Binary Protocol,而memcache不支持。这意味着memcached会有更高的性能。不过memcached目前还不支持长连接。


另外一点也是大家比较关心的,就是所使用的算法。大家都知道“一致性hash算法”是当添加或删除存储节点时,对存储在memcached上的数据影响较小的一种算法。那么在php的两个扩展库中,都可以使用该算法,只是设置方法有所不同。
Memcache
修改php.ini添加:

Memcache.allow_failover = 1
……
……
Memcache.hash_strategy =consistent
Memcache.hash_function =crc32
……
……
或在php中使用ini_set方法:
Ini_set(‘memcache.hash_strategy','standard');
Ini_set(‘memcache.hash_function','crc32');

Memcached
$mem = new memcached();
$mem->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);
$mem->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);
memcached服务端是集中式的缓存系统,分布式实现方法是由客户端决定的。
memcached的分布算法一般有两种选择:
1、根据hash(key)的结果,模连接数的余数决定存储到哪个节点,也就是hash(key)% sessions.size(),这个算法简单快速,表现良好。然而这个算法有个缺点,就是在memcached节点增加或者删除的时候,原有的缓存数据将大规模失效,命中率大受影响,如果节点数多,缓存数据多,重建缓存的代价太高,因此有了第二个算法。
2、Consistent Hashing,一致性哈希算法,他的查找节点过程如下:
    首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2的32次方后仍然找不到服务器,就会保存到第一台memcached服务器上。

memcache在没有任何配置的情况下,是使用第一种方法。memcached要实现第一种方法,似乎是使用(未确认):
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);   

第二种一致性哈希算法:

memcache在php.ini中加
复制代码代码如下:
Memcache.hash_strategy =consistent
Memcache.hash_function =crc32

memcached在程序中加(未确认)
复制代码代码如下:
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);

$mem->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);
$mem->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);

一些参考文档:
memcached分布测试报告(一致性哈希情况下的散列函数选择):
http://www.iyunv.com/topic/346682
PHP模块:Memcached > Memcache:http://www.iyunv/article/27367.htm

如果安装libmemcached有如下出错提示:
make: *** Error 1
make: Leaving directory `/www/soft/libmemcached-0.48'
make: *** Error 1
make: Leaving directory `/www/soft/libmemcached-0.48'
make: *** Error 2

可在configure时增加--disable-64bit CFLAGS="-O3 -march=i686"
即:./configure --prefix=/usr/local/libmemcached --with-memcached --disable-64bit CFLAGS="-O3 -march=i6

下面有一张表,来对比php客户端扩展memcache与memcached :http://code.google.com/p/memcached/wiki/PHPClientComparison
  
  
PHP Client Comparison
  There are primarily two clients used with PHP. One is the older, more widespread pecl/memcache and the other is the newer, less used, more feature richpecl/memcached.
  Both support the basics such as multiple servers, setting vaules, getting values, increment, decrement and getting stats.
  Here are some more advanced features and information.
  
pecl/memcachepecl/memcachedFirst Release Date2004-06-082009-01-29 (beta)Actively Developed?YesYesExternal DependencyNonelibmemcachedFeaturesAutomatic Key Fixup1YesNoAppend/PrependNoYesAutomatic Serialzation2YesYesBinary ProtocolNoOptionalCASNoYesCompressionYesYesCommunication TimeoutConnect OnlyVarious OptionsConsistent HashingYesYesDelayed GetNoYesMulti-GetYesYesSession SupportYesYesSet/Get to a specific serverNoYesStores NumericsConverted to StringsYes  

[*]pecl/memcache will convert an invalid key into a valid key for you. pecl/memcached will return false when trying to set/get a key that is not valid.
[*]You do not have to serialize your objects or arrays before sending them to the set commands. Both clients will do this for you.

  
页: [1]
查看完整版本: php模块memcache和memcached区别分析