一、什么是Memcached
在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这极大的增加了数据库负载。根据“二八原则”,即80%的请求访问了20%的数据,缓存热数据是解决这个问题的好办法。
Memcached 是一个高性能的分布式内存对象缓存系统,由LiveJournal旗下Danga Interactive公司的Brad Fitzpatric带头开发,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。经过多年发展,现已成为mixi、hatena、Facebook、Vox、LiveJournal等众多应用中提高Web扩展性的重要组件。
二、为什么需要Memcached
许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大问题。
Memcached通过缓存热数据,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。图1展示了Memcached的一般性用途:分布式缓存。当浏览器首次请求访问数据时,应用服务器会先从数据库服务器中取得返回给用户,并将其以Key/Value键值对的形式存入Memcached服务器中。当用户第二次访问上次请求的数据时,应用服务器通过在Memcached服务器中查找是否有缓存,如果有则直接从Memcached中读取。由于Memcached服务器将数据存储在内存空间中,所以访问速度比数据库的磁盘IO要快,从而提高了服务响应速度,并且在高峰时间减轻了数据库服务器的负载压力。
图1 Memcached一般性用途
三、Memcached特点
协议简单
Memcached服务器与客户端通信并不使用复杂的XML等格式, 而是使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。基于libevent的事件处理
Memcached使用libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。
libevent: http://www.monkey.org/~provos/libevent/内置的内存存储
Memcached将数据存储于内置的内存存储空间中,自己进行内存的管理,而不是通过多次的malloc向系统请求资源。在内存容量不足时,Memcached采用LRU(Least Recently Used)等策略进行内存调度。Memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题,重启Memcached、重启操作系统等操作都会导致全部数据消失。
互不通信的分布式
Memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。Memcached的分布式,完全取决于客户端的实现。如图2,Memcached客户端会通过一个分布式算法(一致性Hash算法)从Memcached服务器列表中计算出一个Memcached服务器的地址(如果是读请求,则根据Key在分布式算法中得到缓存有该Key的Memcached服务器信息),然后客户端将数据(Key/Value对)传递给计算出来的Memcached服务器(如果是读请求,则从计算出来的memcached服务器中读取含有指定Key的数据)。
图2 Memcached的分布式
四、Memcached安装与使用
Memcached安装
先安装libevent库,然后安装Memcached$ sudo yum install libevent libevent-devel
$ wget http://www.danga.com/memcached/dist/memcached-1.2.5.tar.gz
$ tar zxf memcached-1.2.5.tar.gz
$ cd memcached-1.2.5
$ ./configure
$ make
$ sudo make install启动Memcached
$ /usr/local/bin/memcached -p 11211 -m 64m -vv
Memcached的常用启动选项如下
选项 | 说明 |
---|---|
-p | 使用的TCP端口,默认11211 |
-m | 最大内存大小,默认64M |
-vv | 用very vrebose模式启动,调试信息和错误输出到控制台 |
-d | 作为daemon在后台启动 |
- telnet测试
$ 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
除了set和get操作,还有delete和replace等操作
五、小结
我们初步了解了什么是Memcached,以及Memcached有什么用,有什么特点。另外,我们按照了Memcached并通过telnet进行了简单的测试。总而言之,Memcached是一个高性能的Key/Value缓存系统,通过构建Memcached集群,能够适应大型网站的分布式缓存服务需要。
参考文献
- (1)周旭龙,Key/Value之王,http://www.cnblogs.com/edisonchou/p/3855517.html
- (2)charlee,Memcached完全剖析,http://kb.cnblogs.com/page/42731/