Mamche
memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在已成为 mixi、Facebook、LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。许多 Web 应用都将数据保存到 RDBMS 中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现 RDBMS 的负担加重、数据库响应恶化、网站显示延迟等重大影响。这时就该memcached 大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性。
memcached 作为高速运行的分布式缓存服务器,具有以下的特点。
协议简单
基于 libevent 的事件处理
内置内存存储方式
memcached 不互相通信的分布式
协议简单
memcached 的服务器客户端通信并不使用复杂的 XML 等格式,而使用简单的基于文本行的协议。因此,通过 telnet 也能在 memcached 上保存数据、取得数据。
基于 libevent 的事件处理
libevent 是个程序库,它将 Linux 的 epoll、BSD 类操作系统的 kqueue 等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥 O(1)的性能。memcached 使用这个 libevent 库,因此能在 Linux、BSD、Solaris 等操作系统上发挥其高性能。
内置内存存储方式
为了提高性能,memcached中保存的数据都存储在memcached 内置的内存存储空间中。由于数据仅存在于内存中,因此重启 memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于 LRU(Least Recently Used)算法自动删除不使用的缓存。memcached 本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期。这种技术被称为 lazy(惰性)expiration。因此,memcached 不会在过期监视上耗费 CPU 时间。memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 LeastRecently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当 memcached 的内存空间不足时就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。
memcached 不互相通信的分布式
memcached 尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个 memcached 不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。
部署 Memcached
============================================================
[root@localhost tmp]# tar xflibevent-2.0.15-stable.tar.gz
[root@localhost tmp]# cdlibevent-2.0.15-stable
[root@localhost libevent-2.0.15-stable]#./configure && make && make install
[root@localhost tmp]# tar xfmemcached-1.4.5.tar.gz
[root@localhost tmp]# cd memcached-1.4.5
[root@localhost memcached-1.4.5]#./configure && make && make install
[root@localhost memcached-1.4.5]#./memcached -h
开启memcached监听
[root@localhost memcached-1.4.5]#./memcached -p 11211 -l 192.168.122.10 -u root -m 64 -c 10 -vvv
新建一个窗口使用telnet 对 Memcached 发起连接
[root@node1 ~]# telnet 192.168.122.10 11211
Trying 192.168.122.10...
Connected to 192.168.122.10 (192.168.122.10).
Escape character is '^]'.
返回开启memcached 监听的终端可看到连接提示
<27 server listening (udp)
<27 server listening (udp)
<27 server listening (udp)
<27 server listening (udp)
<28 new auto-negotiating clientconnection
在telnet终端,连接测试,set 存数据,get 取数据
[root@node1 ~]# telnet 192.168.122.10 11211
Trying 192.168.122.10...
Connected to 192.168.122.10(192.168.122.10).
Escape character is '^]'.
set nothing 0 180 10 ----- 0:标识 180:过期时间 10:多少字节
1234567890
STORED
get nothing
VALUE nothing 0 10
1234567890
END
使用测试的 PHP 网页,通过 PHP 连接 Memcached
=========================================================
[root@node1 ~]# yum install httpd php
[root@node1 ~]# rpm -ivhphp-pecl-memcache-2.1.2-1.el5.rf.i386.rpm
[root@node1 ~]# cp memcached.php/var/www/html/
[root@node1 ~]# vim/var/www/html/memcached.php
<?php
$memcache = new Memcache;
$memcache->connect('192.168.122.10',11211) or die ("Could notconnect");
$version = $memcache->getVersion();
echo "Server's version:".$version."<br/>\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object,false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (datawill expire in 10 seconds)<br/>\n";
$get_result = $memcache->get('key');
echo "Data from thecache:<br/>\n";
var_dump($get_result);
?>
[root@node1 ~]# service httpd start
测试:
[root@localhost ~]# elinks --dumphttp://192.168.122.10/test.php
Server's version: 1.4.5
Store data in the cache (data will expirein 10 seconds)
Data from the cache:
object(stdClass)#3 (2) {["str_attr"]=> string(4) "test"["int_attr"]=> int(123) }