一、服务端

之前理解错误了。服务端只有一个memcache,一般把服务端称作memcached(带d),是因为守护进程的名称就是叫做memcached(一个这样的执行程序文件)。

编写的语言:c语言

官网为:http://memcached.org/

 二、客户端

很多人都面对两个php的扩展大有疑惑,而且也记不住,只是知道memcached扩展更加高级嘛。

其实,我觉得,只要了解c语言的两个库的区别,就能知道了本质区别了。

既然要操作服务端,那么就要有客户端来操作。memcache服务官方把操作协议开发出来了,只要你按照它的协议编写的客户端都能与它服务端通信操作数据。

memcached服务端,支持是tcp协议来操作。所以客户端只要按照tcp协议,都能连接服务端操作数据。

目前有两个著名的用c语言的库实现了操作服务端:libmemcache、libmemcached(带d)。先有libmemcache库,后面才发展了libmemcached库

libmemcached库 可不是 libmemcache ,它们是两个不同的客户端库,前者现在的开发比较活跃,后者已经有很长时间没有更新了。

libMemcached库的介绍如下:

http://www.libmemcached.org/libMemcached.html

原文一言就概括了:libMemcached is an open source C/C++ client library and tools for the memcached server (http://danga.com/memcached). It has been designed to be light on memory usage, thread safe, and provide full access to server side methods.

我是一个开源的客户端库或工具,用于操作memcached服务器。什么设计成小内存消耗、线程安全】完全访问服务端的各种函数等等优势啦。

ps:学过c语言的会非常了解,c语言核心部只是包含基本的语法,常见的i/0操作是标准封装的。其他很多功能都通过库的形式提供,你可以调用开源的库来完成自己的功能。

这样可以自己根据自己需要来扩充。如果全部包含在c语言核心部分里面,那么会让c语言核心变得臃肿,有些人用不上那些库,有些人用得上,众口难调。臃肿了损失的是性能和灵活性(有些用户想自己用自己的库,你干嘛封装到里面去增加体积)

三、各种语言封装库来操作memcache服务端

很多语言操作memcache服务端,都通过封装上面这两个库来与memcache服务通信(有现成开源的库,直接用,就像openssl库一样,里面有很多成熟算法了,这方面没人自己去重复造轮子,使用现成开源的openssl库)。

比如java操作memcache服务端,也是这样。那么php操作memcache服务,有两个扩展来操作,就是memcache和memcached。这两个扩展的本质区别就是封装的库(c语言库)不同。

一个是libmemcache库,一个是libmemached库。

ps:扩展是php里面的叫法,英文是extension,php引擎支持扩展的形式动态加模块进去用。

进入主题,php的memcache扩展和memcached扩展的区别

1、基于的库不同(我觉得这是本质区别,库的不同决定了后续差异)。memcache扩展是原生的(基于pecl扩展库)。memcached扩展是基于libmemcached库开发的,所以支持cas操作,cas操作就是多个线程并发修改同一个key的值的时候能够进行处理。

memcache.so和 memcached.so是两个扩展文件名称(php中扩展在linux下是.so后缀,window下是dll文件)。也就是后者就要libmemcached库来实现。

2、mc支持面向对象和面向过程两套接口操作服务端。而mcd扩展只支持面向对象方式操作。这也是库(libmemcached与libmemcache)的不同影响的。

3、 memcached支持Binary Protocol,而memcache不支持。还是库的不同导致。这意味着memcached会有更高的性能。

通过$m->setOption(Memcached::OPT_BINARY_PROTOCOL,true) 设置二进制协议。

ps:理论上二进制解码速度快于文本,但实际优势微乎其微。且目前大部分用户还是使用文本协议,比较简单稳定。实践中使用二进制的还是比较少。

4、mcd扩展提供session处理模块:provides a session handler

纠正:这个其实不是区别来着。从php.net官网上看到,memache扩展也支持的。

原文是这样写的:

在静态编译到php中时使用选项 --disable-memcache-session 可以关闭memcache的session 支持(默认时开启的)

四、版本

使用一些服务,比如腾讯云服务,会特意php操作他们的nosql要用哪个客户端版本。有点晕。

memcached扩展,其实本质是封装了libmemached库。但memcached扩展的最新版本目前是2.x.x版本。

我看了一下libmemcached库的官网,2014年2月的时候,最新版是libmemcached-1.0.18.tar.gz。所以还是1.x.x版本啊。

我之前有个疑惑:memcache扩展和memcached扩展,是哪里出的。官网是哪里?

发现了,这两个扩展其实是php官方在维护,从http://pecl.php.net/下载。

只不过这两个扩展编译的时候的前提条件是要先有libmemcached或libmemcache库

我截图了几张,备忘一下

14年4月,memcached扩展的最新版是2.2.0版本

13年4月,memcache扩展的最新版是3.0版本

2014年11月20日纠正理解偏差:

我以为这两个扩展安装的时候是封装好了libmemcached库或libmemcache库的。所以我之前纳闷,怎么下载页面的修改历史中并没有看到列出的库的版本。是我理解错误。

编译这两个扩展的时候,都需要指定libmemcached库或libmemcache库的的安装路径的。所以预先安装好libmemcached(memcache扩展依赖的是libmemcache库)是编译这个扩展的先决条件。要记得先编译安装好。如下指定安装目录用--with-libmemcached-dir=DIR 来指定路径。这个路径就是安装libmemcached时指定的prefix的值(prefix是指定安装目录)

如果没有指定这个路径项,就会去这些库的默认标准安装目录找(我不知道去哪里找),所以最好是指定库的位置来安装(可控性强,以后遇到问题方便排查原因,比如以前编译php使用pcre扩展,最好使用php引擎内置的pcre库,使用linux系统上面的,容易出现编码支持问题)。

====================================

还有一个libmemcached.so扩展。这个不常用。所以我们以前没见到过。

memcached与libmemcached库的区别

这两个是连接memcached服务端的两个不同的客户端,只是不是给php语言使用的。是给c/c++语言使用的(本来就是用c编写的一个库)

libmemcached 是 C/C++ 语言下的操作 memcache 服务器端的客户端库, 因为 PHP 的扩展也是用 C/C++ 写的, 所以编译安装 memcached.so 时依赖 libmemcached库也是可以理解的(得先安装这个库).

最新文章

  1. jQuery实现在线文档
  2. Git bash 配置ssh key
  3. 胖AP(1602i)与苹果设备之间的问题总结
  4. 【转】Android 语言切换过程分析
  5. IDEA -14 注册码生成工具
  6. orcle 查询数据集对变量赋值函数
  7. 【整理】JavaEE基本框架(Struts2+Spring+MyBatis三层,Struts MVC)之间的关系
  8. 浅谈C中的指针和数组(七)
  9. 关于linux修改max user processes limits的问题
  10. Python爬取百度贴吧数据
  11. 利用Struts拦截器限制上传图片的格式和大小
  12. Ext Js Sencha Cmd 命令 打包charts
  13. 2019-3-26WinForm窗体间如何传值的几种方法
  14. linux下初始化mysql时报错
  15. Android开发过程中的坑及解决方法收录(五)
  16. 【leetcode-66】 加一
  17. oracle move 释放 表空间
  18. POJ 3249 Test for Job
  19. 实验一Java开发环境的熟悉-3
  20. ActiveMQ基本介绍

热门文章

  1. Oracle导入dmp备份文件到不同的表空间中
  2. 使用Doxygen生成net帮助文档
  3. easyui+Spring MVC+hibernate = 乐途
  4. MyEclipse8.5集成Tomcat7时的启动错误:Exception in thread “main” java.lang.NoClassDefFoundError org/apache/commons/logging/LogFactory
  5. DDD:当视图模型、领域模型和数据模型都采用了同样的类型的时候,我们该如何处理?
  6. 使用TFS+GIT实现分布式项目管理
  7. Cool!12幅由小图片组成的创意图像重组作品
  8. 第十二篇 SQL Server代理多服务器管理
  9. IOS开发UI基础UILabel属性
  10. 查找最小的k 个元素之C#算法实现