Memcached是一个高性能的分布式内存缓存服务器。 一般的使用目的是:通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。
许多Web应用都将数据保存到DB中,应用服务器从DB中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现DB的负担加重、数据库响应恶化、 网站显示延迟等重大影响。这时就该memcached大显身手了。
Memcached的特征
Memcached作为高速运行的分布式缓存服务器,具有以下的特点:
- 协议简单
- 基于libevent的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式
下面就Memcached的每个特征进行解释。
1.协议简单
Memcached服务器和客户端之间的通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。因此,通过telnet 也能在Memcached上保存数据、取得数据。
1 2 3 4 5 6 7 8 9 10 |
$ 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的源代码内,也可以参考 http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
2. 基于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
3.内置内存存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。 关于内存存储的详细信息,本连载的第二讲以后前坂会进行介绍,请届时参考。
4.memcached不互相通信的分布式
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢? 这完全取决于客户端的实现。本连载也将介绍memcached的分布式。
Memcached安装方法
安装Memcached比较简单,并且Memcached支持很多平台,Linux,FreeBSD,Solaris,Mac OS X甚至也能安装在Windows上。这里以Ubuntu为例:
首先需要先安装libevent,此时最新版本为:libevent-2.0.22-stable.tar.gz 下载地址:http://libevent.org/
下载并解压到 /opt/soft/libevent-2.0.22-stable 里,运行命令安装:
1 2 3 4 5 6 7 |
cd /opt/soft/libevent-2.0.22-stable ./configure –prefix=/usr make sudo make install |
下载Memcached包,下载地址:http://memcached.org/,并解压至 /opt/soft/memcached-1.4.22,运行命令安装:
1 2 3 4 5 6 7 |
cd /opt/soft/memcached-1.4.22/ ./configure make sudo make install |
默认情况下memcached安装到/usr/local/bin下。
Memcached启动
在终端里输入命令,启动Memcached服务:
1 |
/usr/local/bin/memcached -p 11211 -m 64m -vv |
然后出现,下面如图所示调试信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 slab class 3: chunk size 152 perslab 6898 slab class 4: chunk size 192 perslab 5461 slab class 5: chunk size 240 perslab 4369 slab class 6: chunk size 304 perslab 3449 slab class 7: chunk size 384 perslab 2730 slab class 8: chunk size 480 perslab 2184 slab class 9: chunk size 600 perslab 1747 slab class 10: chunk size 752 perslab 1394 slab class 11: chunk size 944 perslab 1110 slab class 12: chunk size 1184 perslab 885 slab class 13: chunk size 1480 perslab 708 slab class 14: chunk size 1856 perslab 564 slab class 15: chunk size 2320 perslab 451 slab class 16: chunk size 2904 perslab 361 slab class 17: chunk size 3632 perslab 288 slab class 18: chunk size 4544 perslab 230 slab class 19: chunk size 5680 perslab 184 slab class 20: chunk size 7104 perslab 147 slab class 21: chunk size 8880 perslab 118 slab class 22: chunk size 11104 perslab 94 slab class 23: chunk size 13880 perslab 75 slab class 24: chunk size 17352 perslab 60 slab class 25: chunk size 21696 perslab 48 slab class 26: chunk size 27120 perslab 38 slab class 27: chunk size 33904 perslab 30 slab class 28: chunk size 42384 perslab 24 slab class 29: chunk size 52984 perslab 19 slab class 30: chunk size 66232 perslab 15 slab class 31: chunk size 82792 perslab 12 slab class 32: chunk size 103496 perslab 10 slab class 33: chunk size 129376 perslab 8 slab class 34: chunk size 161720 perslab 6 slab class 35: chunk size 202152 perslab 5 slab class 36: chunk size 252696 perslab 4 slab class 37: chunk size 315872 perslab 3 slab class 38: chunk size 394840 perslab 2 slab class 39: chunk size 493552 perslab 2 slab class 40: chunk size 616944 perslab 1 slab class 41: chunk size 771184 perslab 1 slab class 42: chunk size 1048576 perslab 1 <26 server listening (auto-negotiate) <27 server listening (auto-negotiate) <28 send buffer was 212992, now 268435456 <32 send buffer was 212992, now 268435456 <30 server listening (udp) <29 server listening (udp) <34 server listening (udp) <28 server listening (udp) <33 server listening (udp) <31 server listening (udp) <32 server listening (udp) <35 server listening (udp) |
这样就在前台启动了memcached,监听TCP端口11211 最大内存使用量为64M。调试信息的内容大部分是关于存储的信息。而作为daemon后台启动时,命令时这样的:
1 |
/usr/local/bin/memcached -p 11211 -m 64m -d |
这里使用的memcached启动选项的内容如下:
选项 | 说明 |
-p | 使用的TCP端口。默认为11211 |
-m | 最大内存大小。默认为64M |
-vv | 用very vrebose模式启动,调试信息和错误输出到控制台 |
-d | 作为daemon在后台启动 |
上面四个是常用的启动选项,其他还有很多,通过下面一段命令:
1 |
/usr/local/bin/memcached -h |
就可以显示全部命令,许多选项可以改变memcached的各种行为, 推荐仔细阅读一下。
至此,服务器端Memcache算是安装成功了。当然作为高并发Memcached缓存服务器来说,需要仔细推敲下启动参数,以达到最优化。