Mamche

memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在已成为 mixiFacebookLiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。许多 Web 应用都将数据保存到 RDBMS ,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现 RDBMS 的负担加重、数据库响应恶化、网站显示延迟等重大影响。这时就该memcached 大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性。



memcached 作为高速运行的分布式缓存服务器,具有以下的特点。

协议简单

基于 libevent 的事件处理

内置内存存储方式

memcached 不互相通信的分布式



协议简单

memcached 的服务器客户端通信并不使用复杂的 XML 等格式,而使用简单的基于文本行的协议。因此,通过 telnet 也能在 memcached 上保存数据、取得数据。


基于 libevent 的事件处理

libevent 是个程序库,它将 Linux epollBSD 类操作系统的 kqueue 等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥 O(1)的性能。memcached 使用这个 libevent ,因此能在 LinuxBSDSolaris 等操作系统上发挥其高性能。


内置内存存储方式

为了提高性能,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) }