PHP模块 Memcached功能多于Memcache


Posted in PHP onJune 14, 2011

比如说PECL里有两个Memcached的模块,Memcache和Memcached,目前大部分PHP环境里使用的是名字里不带d的Memcache版本,这个版本释出的比较早,是一个原生版本,与之对应的带d的Memcached版本则是建立在libmemcached的基础上,所以说Memcached版本的功能更全一些。

安装Memcached版本的PHP模块

wget http://download.tangent.org/libmemcached-0.35.tar.gz
tar zxf libmemcached-0.35.tar.gz
cd libmemcached-0.35
./configure
make
make install

wget http://pecl.php.net/get/memcached-1.0.0.tgz
tar zxf memcached-1.0.0.tgz
cd memcached-1.0.0
phpize
./configure
make
make install

打开php.ini加上:

extension = "memcached.so"

这样安装就结束了,你可以通过下列命令来确认:

php -m | grep mem

演示Memcached版本的新功能

先虚构一个问题,假设counter初始值是一个整数,不使用increment方法,通过get/set完成每次加一。

在Memcache版本里,我们只能按照大致如下的方式来进行:

$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1);

由于get/set这两个动作无法作为一个原子来操作,所以当多个进程同时处理时,会出现丢失的可能,更让人恼火的是,你根本就不知道什么时候出现丢失。

再看看Memcached版本里,我们是如何做的:

$md = new Memcached();
$md->addServer('localhost', 11211);
$v = $md->get('counter', null, $token)
$md->cas($token, 'counter', $v + 1);

cas是Memcached版本里提供的功能,说白了就是一个乐观锁的功能,如果你把$token的值var_dump出来,就会发现$token其实就是一个版本号,如果通过get得到的$token版本号在cas的时候不对应,就说明已经有别的操作更新了,此时cas操作会失败,至于如何继续操作,就看你自己了。

注:如果你想手动重现一下冲突的情况,可在get和cas之间sleep若干秒,并拷贝两份脚本,先后执行。

顺便说一句,推荐的Memcached版本模块的哈希设置如下:

$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);

总结

Memcached版本还有很多Memcache没有的功能,比如通过getByKey, setByKey等自动支持多个服务器,就不赘述了,该用哪个扩展已经不言自明了。

补充:http://code.google.com/p/memcached/wiki/PHPClientComparison

PHP 相关文章推荐
第十三节 对象串行化 [13]
Oct 09 PHP
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
模拟flock实现文件锁定
Feb 14 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
Apr 13 PHP
php关于array_multisort多维数组排序的使用说明
Jan 04 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
实例分析PHP中PHPMailer发邮件
Dec 13 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
PHP addslashes()函数讲解
Feb 03 PHP
用PHP做了一个领取优惠券活动的示例代码
Jul 05 PHP
php模块memcache和memcached区别分析
Jun 14 #PHP
sphinx增量索引的一个问题
Jun 14 #PHP
批量获取memcache值并按key的顺序返回的实现代码
Jun 14 #PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 #PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
Jun 13 #PHP
php学习笔记 面向对象的构造与析构方法
Jun 13 #PHP
php学习笔记 类的声明与对象实例化
Jun 13 #PHP
You might like
php中批量替换文件名的实现代码
2011/07/20 PHP
PHP异常处理Exception类
2015/12/11 PHP
PHP中include()与require()的区别说明
2017/02/14 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
js实现数字滚动特效
2019/12/16 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
Python中optparse模块使用浅析
2015/01/01 Python
python下MySQLdb用法实例分析
2015/06/08 Python
python 实现红包随机生成算法的简单实例
2017/01/04 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
考试违纪检讨书
2014/02/02 职场文书
市场营销方案范文
2014/03/11 职场文书
员工合理化建议书
2014/05/19 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
2015年团支书工作总结
2015/04/03 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL