Nginx使用redis来缓存php数据

使用redis来缓存PHP数据可以大幅降低客户端请求对PHP服务器的压力,也可以大幅加快请求完成的速度。
首先定义一个

使用redis来缓存PHP数据可以大幅降低客户端请求对PHP服务器的压力,也可以大幅加快请求完成的速度。
首先定义一个测试文件test_cache.php,这个脚本只是单纯的通过curl获取远程地址的一张图片

1
2
3
4
5
6
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://redis.io/images/redis-white.png');
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);

然后配置Nginx,由于Nginx自带的扩展只有memcached的,而memcached没有redis功能强大,所以需要使用第三方扩展,一共需要5个扩展

srcache-nginx-module

echo-nginx-module

ngx-http-redis

redis2-nginx-module

set-misc-nginx-module

把这5个扩展编译到Nginx或者使用动态模块,动态模块可以看
Nginx动态加载模块这篇文章
接着配置Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ($uri ~ test_cache.php$){
set $key $request_uri;
set_escape_uri $escaped_key $key;
srcache_fetch GET /redis $key;
srcache_default_expire 172800;
srcache_store PUT /redis2 key=$escaped_key&exptime=$srcache_expire;
add_header X-Cached $srcache_fetch_status;
set_md5 $md5key $key;
add_header X-Redis-Key $md5key;
add_header X-Cached-Store $srcache_store_status;
add_header X-File $key;
add_header X-Query $query_string;
add_header X-Expire $srcache_expire;
}

这段Nginx配置语句指定了缓存的访问通过/redis这个获取,缓存PUT通过/redis2获取这个时候再来定义/redis和/redis2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location = /redis {
internal;
set_md5 $redis_key $args;
redis_pass 127.0.0.1:6379;
}
location = /redis2 {
internal;
set_unescape_uri $exptime $arg_exptime;
set_unescape_uri $key $arg_key;
set_md5 $key;
redis2_query set $key $echo_request_body;
redis2_query expire $key $exptime;
redis2_pass 127.0.0.1:6379;
}

这两段配置代码就是定义如何存储缓存和如何取缓存。
配置完了后访问test_cache.php就可以发现第一次头中有MISS,而第二次就有HIT,说明缓存命中成功,同时第一次请求服务端花了600毫秒,但是第二次只用了50ms,而且第二次并没有调用php的curl而是直接从redis缓存中获取的,省去了php脚本执行时间。