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 相关文章推荐
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
Jun 09 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
PHP中Enum(枚举)用法实例详解
Dec 07 PHP
php+jQuery递归调用POST循环请求示例
Oct 14 PHP
Yii2实现增删改查后留在当前页的方法详解
Jan 13 PHP
php利用fsockopen GET/POST提交表单及上传文件
May 22 PHP
掌握PHP垃圾回收机制详解
Mar 13 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
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
web页面数据展示新想法(json)
2010/06/08 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
jquery调用wcf并展示出数据的方法
2011/07/07 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
js事件触发操作实例分析
2019/06/21 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
Python中的字典与成员运算符初步探究
2015/10/13 Python
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
python按比例随机切分数据的实现
2019/07/11 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
2014年师德师风学习材料
2014/05/16 职场文书
承诺书样本
2014/08/30 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
解决redis批量删除key值的问题
2022/03/23 Redis