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与SQL注入攻击[三]
Apr 17 PHP
php 特殊字符处理函数
Sep 05 PHP
php 显示指定路径下的图片
Oct 29 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
php中spl_autoload详解
Oct 17 PHP
php中最简单的字符串匹配算法
Dec 16 PHP
3种php生成唯一id的方法
Nov 23 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
yii2缓存Caching基本用法示例
Jul 18 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
Mar 13 PHP
laravel执行php artisan migrate报错的解决方法
Oct 09 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实现的随机广告显示代码
2007/06/14 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
2016/01/06 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
2019/05/22 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
九年级英语教学反思
2014/01/31 职场文书
《乞巧》教学反思
2014/02/27 职场文书
成人继续教育实施方案
2014/03/01 职场文书
消防安全责任书范本
2014/04/15 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
房产协议书范本2014
2014/09/30 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
辞职书格式样本
2015/02/26 职场文书
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript