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 相关文章推荐
实时抓取YAHOO股票报价的代码
Oct 09 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
PHP实现读取一个1G的文件大小
Aug 24 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
PHP生成plist数据的方法
Jun 16 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
Dec 10 PHP
一个简单的php路由类
May 29 PHP
PHP的时间戳与具体时间转化的简单实现
Jun 13 PHP
微信 getAccessToken方法详解及实例
Nov 23 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
PHP lcfirst()函数定义与用法
Mar 08 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读注册表
2006/10/09 PHP
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
php定时执行任务设置详解
2015/02/06 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
招商业务员岗位职责
2013/12/16 职场文书
师说教学反思
2014/02/07 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android