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 相关文章推荐
十天学会php之第八天
Oct 09 PHP
php下通过POST还是GET来传值
Jun 05 PHP
THINKPHP+JS实现缩放图片式截图的实现
Mar 07 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
Apr 09 PHP
教你如何使用php session
Oct 28 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
PHP变量赋值、代入给JavaScript中的变量
Jun 29 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
php使用crypt()函数进行加密
Jun 08 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
PHP获取MySQL执行sql语句的查询时间方法
Aug 21 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模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
Python 通配符删除文件的实例
2018/04/24 Python
详解python之协程gevent模块
2018/06/14 Python
python实现机器学习之多元线性回归
2018/09/06 Python
python 调试冷知识(小结)
2019/11/11 Python
pytorch forward两个参数实例
2020/01/17 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
行政部工作岗位职责范本
2014/03/05 职场文书
企业新年寄语
2014/04/04 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
星级党支部申报材料
2014/05/31 职场文书
技术负责人任命书
2014/06/05 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
2014年共青团工作总结
2014/12/10 职场文书
数学教师个人工作总结
2015/02/06 职场文书