因为项目要用到Memcache,就研究了一下,然后记个流水帐。
Memcached是一个开源的分布式内存对象缓存系统。虽然从本质上看用途很宽泛,但它的主要设计目的是通过减轻数据库负载来加速动态网站。它本身作为单独的进程运行,通过TCP和需要存取数据的其它进程(如php、python)通信。
以Debian为例,它的安装非常简单:
先装上libevent-dev包,然后解压源码,编译安装即可。
./configure
make && make install
PHP有两个模块:Memcache和Memcached。他们都是PHP的memcached客户端库,只不过Memcached提供了更多功能。就先看第一个。
首先下载它的源代码,解压。确保安装了php5-dev,然后在解压后的目录里执行:
phpize
./configure
make && make install
然后再/etc/php/conf.d/里加一个memcache.ini文件,内容就一句extension=memcache.so就可以了。然后重启apache或者挂了php-cgi的进程。
然后启动之前编译的Memcached:
memcached -u www-data -d
-u是指定memcached的用户,-d是让它作为daemon。
接下来就可以写Hello world了:
<!doctype html>
<meta charset=utf8 />
result:
<?php
$memcache = new Memcache();
$memcache->connect("127.0.0.1", 11211);
$data = $memcache->get("data");
//echo $data;
if($data === false || $_GET["force"]){
$data = $_GET['data'];
}
$memcache->set("data", $data, MEMCACHE_COMPRESSED, 10);
echo $data;
?>
<form action="" method="GET">
<input name="force" type="checkbox" />Force update
<p>
<input name="data" />
<input type=submit />
</form>
这里将一个填入文本框的data字符串显示出来,并存入Memcached中,过期时间设为10秒钟。如果Memcached中保存了这个字符串,就将它取出来,否则把用户新输入的字符串存进去。
然后测了下性能:
单侧php的性能,php内容为上面的代码把memcache相关内容移除,另外echo换成echo "hello":
2713.06 [#/sec]
然后测Memcached的get(上面的hello world不加参数):
1769.21 [#/sec]
Memcached进行get和set(上面的hello world加force=on&data=asdfkjasldfasd980fuwe):
1751.05 [#/sec]
可以看出Memcache因为要建立TCP连接,还是损失了不小的性能,慢在connect。如非缓存确实比读取数据库、处理要省很多时间,否则不应随意使用。