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 相关文章推荐
用libTemplate实现静态网页的生成
Oct 09 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
Jul 03 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
在PHP中使用X-SendFile头让文件下载更快
Jun 01 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
Jun 12 PHP
php将远程图片保存到本地服务器的实现代码
Aug 03 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
实例解析php的数据类型
Oct 24 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 PHP
PHP+MySql实现一个简单的留言板
Jul 19 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
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
yii分页组件用法实例分析
2015/12/28 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
PHP实现的日历功能示例
2018/09/01 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
python函数缺省值与引用学习笔记分享
2013/02/10 Python
python实现telnet客户端的方法
2015/04/15 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
python机器学习之随机森林(七)
2018/03/26 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
高一自我鉴定
2013/12/17 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
开学第一周值周总结
2015/07/16 职场文书
教师病假条范文
2015/08/17 职场文书
nginx优化的六点方法
2021/03/31 Servers