本文是基于网上资料和自己的理解整理的学习笔记,中间涉及的网络资料,我在文档后的参考统一列举。如果我的某些理解有误,望谅解,并希望得到你的回复。
在许多高并发的应用中,把业务数据保持久化 ( 保存到数据库,磁盘文件或其它 ) 后,应用从持久化设备中读取数据并在浏览器中显示,随用户量,数据量增大,访问的集中,会出现持久化设备负担过重(典型的就是数据库),影响应用响应速度,应用延迟严重等重大问题。典型的应用就是 WEB 应用中的高并发网站。
这时候应用就需要一种缓存机制来提高并发读取速度的性能 , memcached 能在大中型系统中提供优秀的缓存服务。 memcached 是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性。
memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在已成为 mixi 、 hatena 、 Facebook 、 Vox 、 LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。
官方网站: http://memcached.com
Memcached 的原理和功能如下图:
这图片是网上找的,后面有引用地址,画的很贴切,本想自己画个,但是想了下,自己画来也差不多,就懒了。。。
memcached 的服务器客户端通信并不使用复杂的 XML 等格式, 而使用简单的基于文本行的协议。因此,通过 telnet 也能在 memcached 上保存数据、取得数据。下面是官方的例子:
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)
协议文档位于 memcached 的源代码内,也可以参考以下的 URL 。
http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
命令介绍请参考后续介绍
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 的分布式。