OpenResty Lua Redis 加速接口响应技术
本文以完整的示例,展示使用 Nginx、Lua、Redis 对响应速度慢的接口进行加速响应,提供快速的用户体验。代码经过严格的测试,没有任何问题。缓存的核心思想在于读取缓存后,即时中断连接,返回结果,然后继续执行,更新缓存。可以缓存的接口一般都是与用户无关的接口,比如计算当日热度最高的商品排行等。
<?php
sleep(2);
echo 'sleep 2 seconds, date is '.date("Y-m-d H:i:s")."\n";
测试接口访问效果,需要等待 2 秒后才能返回结果,如下示例:
$ curl -XGET lua.may:90/test.php sleep 2 seconds, date is 2017-09-19 10:44:58
以下代码的核心作用就是使用 Lua 对接口内容进行操作,存储到 redis 中;一旦有请求过来,立即读取缓存,快速响应,然后再去更新缓存,使用 ngx.eof() 实现非阻塞。下面的例子中使用了 content_by_lua,实际使用时,可以使用 content_by_lua_file 进行封装。OpenResty Nginx 配置如下:
server {
listen 90;
server_name lua.may;
error_log /usr/local/openresty/log/nginx/lua.may.error.log;
charset utf-8;
root /srv/www/may/lua;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(.*)$;
include fastcgi_params;
}
location /accelerate_test {
content_by_lua '
local redis = require "resty.redis"
local cache = redis.new()
cache.connect(cache, "127.0.0.1", "6379")
cache:auth("password");
local cache_content = cache:get("foo")
if cache_content==ngx.null then
local res = ngx.location.capture("/test.php")
ngx.say("data: " .. res.body)
cache:set("foo", res.body)
return
end
ngx.say("cache: " .. cache_content)
ngx.eof();
local res = ngx.location.capture("/test.php")
cache:set("foo", res.body)
';
}
}
使用加速接口后,即时返回结果,没有任何延迟:
$ curl -XGET lua.may:90/accelerate_test cache: sleep 2 seconds, date is 2017-09-19 10:45:40
以上就是完整的示例,技术本身都是很简单的,难就难在代码实现上。
相关文章
暂无