Memcached 简介
Memcached 是什么?
Memcached 是以 LiveJournal [1] 旗下 Danga Interactive 公司的 Brad Fitzpatric [2] 为首开发的一款软件。现在已成为 mixi、 hatena、非死book、Vox、LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。许多 Web 应用都将数据保存到 RDBMS 中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现 RDBMS 的负担加重、数据库响应恶化、网站显示延迟等重大影响。
这时就该 memcached 大显身手了。memcached 是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站更快的运行速度。Memcached 基于一个存储键/值对的 hashmap。其守护进程(daemon )是用 C 写的,但是客户端可以用任何语言来编写,并通过 memcached 协议与守护进程通信。但是它并不提供冗余(例如,复制其 hashmap 条目);当某个服务器 S 停止运行或崩溃了,所有存放在 S 上的键/值对都将丢失。
(截取自:http://baike.baidu.com/view/794242.htm)
Memcached 能缓存什么?
通过在内存里维护一个统一的巨大的 hash 表,Memcached 能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
Memcached 快么?
非常快。memcached 使用了 libevent(如果可以的话,在 linux 下使用 epoll)来均衡任何数量的打开链接,使用非阻塞的网络 I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。
Danga Interactive 为提升 Danga Interactive 的速度研发了 memcached。目前,LiveJournal.com 每天已经在向一百万用户提供多达两千万次的页面访问。而这些,是由一个由 web 服务器和数据库服务器组成的集群完成的。memcached 几乎完全放弃了任何数据都从数据库读取的方式,同时,它还缩短了用户查看页面的速度、更好的资源分配方式,以及 memcache 失效时对数据库的访问速度。
(截取自:http://developer.51cto.com/art/200902/108601.htm)
Memcached 特征是什么?
- 协议简单
- 基于libevent的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式
协议简单
memcached 的服务器客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。因此,通过 telnet 也能在 memcached 上保存数据、取得数据。
基于libevent的事件处理
libevent 是个程序库,它将 Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。即使对服务器的连接数增加,也能发挥 O(1) 的性能。 memcached 使用这个 libevent 库,因此能在 Linux、BSD、Solaris 等操作系统上发挥其高性能。 关于事件处理这里就不再详细介绍,可以参考 Dan Kegel 的 The C10K Problem。
- libevent: http://www.monkey.org/~provos/libevent/
- The C10K Problem: http://www.kegel.com/c10k.html
内置内存存储方式
为了提高性能,memcached 中保存的数据都存储在 memcached 内置的内存存储空间中。 由于数据仅存在于内存中,因此重启 memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU( Least Recently Used ) 算法自动删除不使用的缓存。 memcached 本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
memcached不互相通信的分布式
memcached 尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个 memcached 不会互相通信以共享信息。那么,怎样进行分布式呢? 这完全取决于客户端的实现。
memcached的分布式
(截取自:http://tech.idv2.com/2008/07/10/memcached-001/)
Memcached 适合什么场合?
在很多时候,memcached 都被滥用了,这当然少不了对它的抱怨。我经常在论坛上看见有人发贴,类似于“如何提高效率”,回复是“用 memcached ”,至于怎么用,用在哪里,用来干什么一句没有。memcached 不是万能的,它也不是适用在所有场合。
Memcached是 “分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached 不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是 UNIX 本地连接也一样。 在我之前的测试数据中显示,memcached 本地读写速度要比直接 PHP 内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是本地级缓存,使用 memcached 是非常不划算的。
Memcached 在很多时候都是作为数据库前端 cache 使用的。因为它比数据库少了很多 SQL 解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁 的,memcached 可以大大降低数据库压力,使系统执行效率提升。另外,memcached 也经常作为服务器之间数据共享的存储媒介,例如在 SSO 系统中保存系统单点登陆状态的数据就可以保存在 memcached 中,被多个应用共享。
需要注意的是,memcached 使用内存管理数据,所以它是易失的,当服务器重启,或者 memcached 进程中止,数据便会丢失,所以 memcached 不能用来持久保存数据。很多人的错误理解,memcached 的性能非常好,好到了内存和硬盘的对比程度,其实 memcached 使用内存并不会得到成百上千的读写速度提高,它的实际瓶颈在于网络连接,它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和 直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了, memcached 进程本身并不占用多少 CPU 资源的情况。(截取自: http://blog.developers.api.sina.com.cn/?p=124 )
扩展阅读:
1.LiveJournal(经常被简写为LJ)是一个在互联网上提供写作的虚拟社区服务 http://www.livejournal.com/
2.Brad Fitzpatrick:http://bradfitz.com/