Memcache与Memcached最新详细解析
在近期的搭配环境中学习了memcache、memcached、php-memcache、php-memcached等的异同,通过查询大量资料以及实践总结出本篇文章。
一、memcache
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
一般目的可总结为:通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web应用的速度、提高可扩展性。
MemCache的工作流程(如下图):
先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作。
如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现)。
每次更新数据库的同时更新memcached中的数据,保证一致性。
二、memcached
Memcache是该系统的项目名称,Memcached是该系统的主程序文件(字母d可以理解为daemon:守护进程),以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,使用共享内存存取数据。
memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。
memcached作为小规模的数据分布式平台是十分有效果的。
其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
memcached有以下几点特征:
- 协议简单:memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。
- 基于libevent的事件处理:libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
-
内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
-
通信分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。
memcached 的分布式是什么意思?
三、PHP针对memcache有两个PECL扩展,一个是php-memcache、一个是php-memcached
memcache扩展是完全在PHP框架内开发的,memecached是基于原生的c的libmemcached的扩展,更加完善以及强大。
可以说php-memcached是php-memcache的升级版,增强版。建议使用memcached扩展。
二者区别:
- memcache是原生实现的,但是使用libmemcached的memached只支持OO接口,而 memcache则是OO和非OO两套接口均支持。
- memcached,还有个非常称赞的地方,就是flag不是在操作的时候设置了。而是有一个统一的setOption()。memcached 实现了更多的 memcached 协议。
- 最重要的一点,memcached 支持 Binary Protocol(二进制协议,即可由机器直接读取),而 memcache 不支持,意味着 memcached 会有更高的性能。
- 网上广泛流传着这样的说法,讲述php的两个扩展模块memcache和memcached的区别,其中特意强调了memcached与memcached一个很大的区别是memcached模块不支持长连接。其实不然,memcached扩展模块从很早的版本开始就已经支持长连接了。
总结:
memcache的主进程名字memcached与php中一个memcache扩展名相同,但概念切勿混淆。
php-memcache、php-memcached是php的扩展,是用于通过php使用memcached的。
如果安装了memcached而不安装相应的php扩展,那么php无法操控memcached,但是终端上面可以正常使用memcached。
memcached也是一种服务器,是内存缓存服务器,其客户端是指开发者用的语言例如php、python、等,这些相对于服务器就是客户,可以理解为php-memcache、php-memcached就是php与memcache的客户端。
下图形象的说明了以上概念的关系(每种语言都有自己对memcache的扩展)