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中通过Ajax如何实现异步文件上传的代码实例
May 07 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
PHP防盗链代码实例
Aug 27 PHP
php表单敏感字符过滤类
Dec 08 PHP
PHP获取youku视频真实flv文件地址的方法
Dec 23 PHP
php二维数组合并及去重复的方法
Mar 04 PHP
yii2超好用的日期组件和时间组件
May 05 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
Laravel 批量更新多条数据的示例
Nov 27 PHP
PHP中类与对象功能、用法实例解读
Mar 27 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
杏林同学录(八)
2006/10/09 PHP
PHP读取xml方法介绍
2013/01/12 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
VUE中的无限循环代码解析
2017/09/22 Javascript
vue服务端渲染缓存应用详解
2018/09/12 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
bootstrap datepicker的基本使用教程
2019/07/09 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python 字典与字符串的互转实例
2017/01/13 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
Python hashlib模块实例使用详解
2019/12/24 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
中文系学生自荐信范文
2013/11/13 职场文书
文秘专业应届生求职信范文
2013/11/14 职场文书
初三学生个人自我评定
2014/04/06 职场文书
让生命充满爱观后感
2015/06/08 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书