博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php模块memcache和memcached区别分析
阅读量:4120 次
发布时间:2019-05-25

本文共 3733 字,大约阅读时间需要 12 分钟。

转自:

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

(php模块memcache下载地址:

php模块memcached下载地址:d)

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] 
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.iteye.com/topic/346682 

PHP模块:Memcached > Memcache:

如果安装libmemcached有如下出错提示: 

make[2]: *** [clients/ms_conn.o] Error 1 

make[2]: Leaving directory `/www/soft/libmemcached-0.48' 

make[1]: *** [all-recursive] Error 1 

make[1]: Leaving directory `/www/soft/libmemcached-0.48' 

make: *** [all] 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 

PHP Client Comparison

There are primarily two clients used with PHP. One is the older, more widespread  and the other is the newer, less used, more feature rich.

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.

 
First Release Date 2004-06-08 2009-01-29 (beta)
Actively Developed? Yes Yes
External Dependency None
Features
Automatic Key Fixup1 Yes No
Append/Prepend No Yes
Automatic Serialzation2 Yes Yes
Binary Protocol No Optional
CAS No Yes
Compression Yes Yes
Communication Timeout Connect Only Various Options
Consistent Hashing Yes Yes
Delayed Get No Yes
Multi-Get Yes Yes
Session Support Yes Yes
Set/Get to a specific server No Yes
Stores Numerics Converted to Strings Yes

  1. 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.
  2. You do not have to serialize your objects or arrays before sending them to the set commands. Both clients will do this for you.

转载地址:http://uispi.baihongyu.com/

你可能感兴趣的文章
树莓派Zero W 通过homebridge ,8266制作siri控制的RGB灯
查看>>
树莓派Zero W初始化配置
查看>>
一种取得BSTR内容字节数的写法
查看>>
Win32环境下两种用于C++的线程同步类(上)
查看>>
Win32环境下两种用于C++的线程同步类(下)
查看>>
“对口答辩”随想
查看>>
初探google toolbar上关键词标记的实现方式
查看>>
用内联汇编调虚函数 理解VTABLE原理
查看>>
感谢周杰伦
查看>>
今年的“武林外传”会是谁呢?
查看>>
我为什么喜欢用WIN2000而非WINXP
查看>>
设想一种防U盘病毒的方法,不知道是否管用
查看>>
我的QQ终于能传文件了
查看>>
应用程序上屏蔽FLASH控件的右键菜单并获得左键消息
查看>>
基于动态代码生成技术的动态对象工厂
查看>>
对《基于动态代码生成技术的动态对象工厂》一文的补充
查看>>
越帮越忙的珊瑚虫快捷键
查看>>
为什么需要override关键字
查看>>
结合短路法和逗号表达式,代替if和三目运算符
查看>>
一些匿名语言元素
查看>>