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获取网址的顶级域名函数代码
Sep 24 PHP
php cli 小技巧
Jun 03 PHP
php json_encode值中大括号与花括号区别
Sep 30 PHP
php中的比较运算符详解
Oct 28 PHP
ThinkPHP的L方法使用简介
Jun 18 PHP
php中实现xml与mysql数据相互转换的方法
Dec 25 PHP
php中switch语句用法详解
Aug 17 PHP
Symfony2开发之控制器用法实例分析
Feb 05 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
Oct 12 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
Oct 16 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
点评山进PR-D3L三波段收音机
2021/03/02 无线电
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
yii添删改查实例
2015/11/16 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
常用的javascript function代码
2008/05/23 Javascript
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
jQuery插件scroll实现无缝滚动效果
2015/04/27 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
javascript history对象详解
2017/02/09 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
js判断密码强度的方法
2020/03/18 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
python实现的防DDoS脚本
2011/02/08 Python
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
Python实现快速多线程ping的方法
2015/07/15 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
python实现图片素描效果
2020/09/26 Python
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
函授本科毕业自我鉴定
2013/10/09 职场文书
应届生学校辅导员求职信
2013/11/07 职场文书
文秘专业个人求职信
2013/12/22 职场文书
村官2015年度工作总结
2015/10/14 职场文书
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang