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实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
May 07 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
Feb 17 PHP
file_get_contents("php://input", "r")实例介绍
Jul 01 PHP
PHP中常用的转义函数
Feb 28 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 PHP
初识php MVC
Sep 10 PHP
crontab无法执行php的解决方法
Jan 25 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
PHP实现简单ajax Loading加载功能示例
Dec 28 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
php使用array_chunk函数将一个数组分割成多个数组
Dec 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 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
php+highchats生成动态统计图
2014/05/21 PHP
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
进一步理解Python中的函数编程
2015/04/13 Python
python 队列详解及实例代码
2016/10/18 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
树莓派升级python的具体步骤
2020/07/05 Python
python实现扫雷游戏的示例
2020/10/20 Python
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
毕业生求职简历的自我评价
2013/10/23 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
作风建设演讲稿
2014/05/23 职场文书
创先争优宣传标语
2014/10/08 职场文书
加班费申请报告
2015/05/15 职场文书
小学美术教学反思
2016/02/17 职场文书
python如何读取.mtx文件
2021/04/22 Python
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle
对PyTorch中inplace字段的全面理解
2021/05/22 Python
Golang并发工具Singleflight
2022/05/06 Golang