php上的memcache和memcached两个pecl库


Posted in PHP onMarch 29, 2010

之前尝试用的是memcache,后来发现memcached支持setMulti方法,准备转向使用memcached库了。

(试了下,实际上,memcache从支持多值set,但文档上还没有,看changelog好像是3.0开始支持,稳定版可能不带此功能。)

至于效率,也不清楚会有多大差距。

这里有一篇文章也说到,memcached是基于libmemcached,可能要好一些。

终于,基于libmemached的php扩展在pecl发布了。

于是,现在pecl上有两个memcache客户端了。一个是完全在PHP框架内开发的memcache,一个是使用libmemcached的memecached

功能嘛,我没看过libmemcached,但是理论上来说,在其他语言里已经很流行的libmemcached应该会有更完善的功能。而程序上性能(内存和CPU使用率),不好说,虽然pecl::memcache是原生实现的,但是使用libmemcached的pecl::memached只支持OO接口,而pecl::memcache则是OO和非OO两套接口并存,这点拖累了它。

其实这些都不是最重要的。使用libmemcached有个明显的优点,就是以后随着memcached服务器端的改进,这个lib也必定会马上跟进的。而pecl::memcache却不一定能做到按时跟进。

pecl::memcached,还有个非常称赞的地方,就是flag不是在操作的时候设置了。而是有一个统一的setOption()。冲着这个方法,就非常值得从pecl::memcache转到pecl::memcached了。具体的接口可以看这里:http://cvs.php.net/viewvc.cgi/pecl/memcached/memcached-api.php?view=markup

我在pecl-dev@里提到是否可以做成driver-based的架构。跟现在的MySQL一样,可以选择使用mysqlnd或者libmysql作为底层的引擎。但是之后想想,其实我并不是很支持对memcached使用这样的架构,它和MySQL的情况不一样。

mysqlnd作为一个引擎而不是一个新的api来开发,可以使得大量的应用程序不需要对数据库操作做修改即可用上新的引擎。如果mysqlnd作为一个新的extension,那么如果它想兼容以前的程序,就面临一个很困难的选择。因为目前为止,存在3个官方的使用libmysql的,并具有不同对外接口的MySQL类集。mysqlnd能兼容mysql,就无法兼容mysqli或者pdo。当然对于使用自己的抽象数据库类的程序来说,这个可以通过改写类或者更换driver(php层面)来实现兼容。但是要想想,就算是使用抽象库,这个世界如此之多的数据库抽象库,如果要让所有人都用得起nd,那得改多少个库,加多少个driver阿。

memcached的情况就简单很多了,目前和官方关系比较密切的只有pecl::memcache,而且接口基本上都是根据memcached的协议来的,和libmemcache相差无几。它们其实都可以被看作是一个抽象类里的不同driver。所以虽然是两套不同的客户端,但是更换起来,几乎不需要做什么改动,只需要在类初始化的地方更改一下,set/get等等这些方法的flag去掉即可,除非你使用了非OO的接口。

另外mysql在通讯和数据获取上也比memcache复杂,nd可以做到一些libmysql无法做到的事情。例如buffer可以直接用php内部的HashTable和zval存储;再例如一些作为持久链接的结构可以更多地缓存起来。(这些例如只是我的猜测,我并没有去阅读过mysqlnd的代码)

Memcached manual:

PHP 相关文章推荐
PHP.MVC的模板标签系统(二)
Sep 05 PHP
第十三节 对象串行化 [13]
Oct 09 PHP
php基础知识:类与对象(1)
Dec 13 PHP
phpmyadmin 3.4 空密码登录的实现方法
May 29 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
Apr 08 PHP
PHP中imagick函数的中文解释
Jan 21 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
CI框架中数据库操作函数$this->db->where()相关用法总结
May 17 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 PHP
php7中停止php-fpm服务的方法详解
May 09 PHP
php 字符串函数收集
Mar 29 #PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
Mar 27 #PHP
PHP初学者最感迷茫的问题小结
Mar 27 #PHP
php echo()和print()、require()和include()函数区别说明
Mar 27 #PHP
PHP 一个比较完善的简单文件上传
Mar 25 #PHP
php+mysql 实现身份验证代码
Mar 24 #PHP
PHP 抓取网页图片并且另存为的实现代码
Mar 24 #PHP
You might like
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
如何理解Vue的.sync修饰符的使用
2017/08/17 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
原生JS实现留言板功能
2020/02/08 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
uniapp,微信小程序中使用 MQTT的问题
2020/07/11 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python实现登陆文件验证方法
2018/10/06 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
Ruby如何进行文件操作
2014/07/17 面试题
一份报关员的职业规划范文
2014/01/08 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
秋天的图画教学反思
2014/05/01 职场文书
小学生读书笔记
2015/07/01 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
2016年中秋节寄语大全
2015/12/07 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android
Python使用MapReduce进行简单的销售统计
2022/04/22 Python