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 相关文章推荐
smarty的保留变量问题
Oct 23 PHP
PHP日期时间函数的高级应用技巧
May 16 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
Aug 08 PHP
解析PHP中的unset究竟会不会释放内存
Jul 18 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
Dec 28 PHP
Yii2简单实现给表单添加验证码的方法
Jul 18 PHP
PHP数据库处理封装类实例
Dec 24 PHP
PHP获取访问设备信息的方法示例
Feb 20 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
php 获取完整url地址
2008/12/20 PHP
phpMyAdmin 安装及问题总结
2009/05/28 PHP
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
JavaScript 提升运行速度之循环篇 译文
2009/08/15 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
小程序云开发实战小结
2018/10/25 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python自动zip压缩目录的方法
2015/06/28 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
对Python 数组的切片操作详解
2018/07/02 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
Django数据库迁移常见使用方法
2020/11/12 Python
新学期开学寄语
2014/01/18 职场文书
《中华少年》教学反思
2014/02/15 职场文书
努力学习演讲稿
2014/05/10 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js