140910574.png
1、memcache介绍
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
和php的配合则需要安装一个memcached的服务端和memcache的php扩展。memcached 官网 http://www.memcached.org/。
2、memcache工作原理
memcache是一个高性能分布式内存对象缓存系统,可以构建大负载网站以便分担数据库的读写压力。以守护程序方式运行一个或多个服务器中,随时接受客户端连接操作,客户端可以由各种语言来编写,我们只介绍php操作。当客户端与memcached服务建立连接后,就是做读写操作,每个对象都有一个唯一的key值,读取都通过key来操作。保存的对象都是存放在一块自己分配的内存块中,并不是保存在磁盘文件中,memcached来管理这些key=》value对应的HashTable数据结构。如若当服务停止或服务器重启后,memcache中保留的数据也被清除。而在架构中他一般承担的角色为把数据库中有一定原子性的数据取出后保存至内存中,供前台服务使用,以便来提高和减轻数据库的承载压力。
spacer.gif140939732.png
(图例说明:当一个请求过来时,根据key读取cache,如果返回为空从数据库取出数据后重新更新cache,如果cache返回有值则直接返回。)
3、memcache优缺点
分布式:可以在多个机器上运行多个memcache进程,同一台机器上的memcache可以用不同的端口区分,通过算法(比如一致性hash http://blog.csdn.net/sparkliang/article/details/5279393和其他分布式算法http://blog.csdn.net/cutesource/article/details/5813379)可以将每一次请求的数据分散到指定一个服务上。
spacer.gif141037131.png
(存储某个key-value)
spacer.gif141056282.png
(取某个key-value)
内存:memcache工作原理上面已经说过,是在内存中维护一张很大的hash表,目前只支持一种对应型的数据结构。memcache自己不会监控存入的key/value是否过期,而是当下次获取key时查看记录的时间戳,检查是否过期。这种策略也不会在过期检查上浪费cpu资源。而内存回收memcache采用删除最近最少使用的key/value对,将删除后多出的空间分配给新的key/value对。
4、memcached服务的安装
1)安装memcached需要libevent库的支持,他是memcached所依赖的异步事件通知库。
libevent 官网:http://libevent.org/
下载并安装最新稳定版2.0.21
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr
make && make install
2)下载最新版的服务端memcached(v1.4.15)
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
tar -zxvf memcached-1.4.15.tar.gz
cd memcached-1.4.15
./configure --with-libevent=/usr
make && make install
3)成功后启动
/usr/local/bin/memcached -d -m 32 -l 127.0.0.1 -p 12000 -u root -P /tmp/memcached.pid
-d:选项是启动一个守护进程
-m:分配给Memcache使用的内存数量,单位是MB
-u:运行Memcache的用户
-l:是监听的服务器IP地址
-p:是设置Memcache监听的端口
-c:选项是最大运行的并发连接数,默认是1024
-P:设置保存Memcache的pid文件,里面保存着memcached的进程号。
如果要结束Memcache进程,执行: # kill `cat /tmp/memcached.pid`
5、安装memcache php扩展
141116913.png
wget http://pecl.php.net/get/memcache-3.0.8.tgz
tar -zxvf memcache-3.0.8.tgz
cd memcache-3.0.8
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
安装成功后打开php.ini文件增加 extension = "memcache.so"
重启php
killall php-fpm
/usr/local/php/sbin/php-fpm
至此查看phpinfo,memcache已经安装成。
6、php中memcache的应用
文章到此其实就了一段落了,因为php的应用实在很简单,下面整理了一份php代码。
//连接
$m = new Memcache;
$m->connect("127.0.0.1", 12000);

//保存
$m->set('good', 'i love you', 0, 60);
//Memcache::set()向good存储一个元素值(字符串和数值直接存储,其他类型序列化后存储。)为i love you 。参数60是以秒为单位的失效时间, 如果设置为0表明该元素永不过期(但是它可能会因为为了给其他项分配空间而被删除)。如果你希望存储的元素经过压缩(使用zlib),你可以设置第三个参数为MEMCACHE_COMPRESSED。
$val = $mem->get('good');
//output $val i love you

//替换
$m->replace('good', 'i love you too', 0, 60);
$val = $m->get('good');
//output $val i love you too

//删除
$m->delete('good');
$val = $m->get('good');
//output $val null
//保存
$m->set('good2', 'i love you', 0, 60);
//清除所有
$m->flush();
$val = $m->get('good2');
//output $val null

//关闭连接
$m->close();
具体参阅php手册 http://www.php.net/manual/zh/book.memcache.php
spacer.gif142107654.png
7、memcache工具
这里介绍一个memcache监控工具 memcache top
memcache-top的project地址如下  http://code.google.com/p/memcache-top/
下载后只有一个文件,可以打开它并进行memcached集群配置,多个节点之间以逗号分隔。
# List of servers/ ports to query.
@default_instances = (
 '127.0.0.1:11211',
);
运行前要确保memcache-top脚本具有可执行权限,然后使用./执行即可。
spacer.gif
memcache-top比较重要的几个参数包括:
–commands: 显示GETS/SETS命令的调用次数
–sleep: 刷新间隔,默认为3秒
–lifetime: 显示自memcached启动以来的累计统计值,默认关闭,即仅显示瞬时速率。