1. Nginx 主配置文件
## Openrestry 的 http 中加入lua本地缓存
http {
...
# 添加共享字典,也就是本地缓存,名称叫做:dis_cache,大小150m
lua_shared_dict dis_cache 150m;
...
}
2. Lua脚本
local function close_redis(red)
if not red then
return
end
--释放连接(连接池实现)
local pool_max_idle_time = 10000 --毫秒
local pool_size = 100 --连接池大小
local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
if not ok then
ngx.say("set keepalive error : ", err)
end
end
-- 获取以GET方式传参的数据
local args = ngx.req.get_uri_args()
local key = args["area_code"]
--尝试从本地缓存中获取
local cache_ngx = ngx.shared.dis_cache;
--根据KEY 获取本地缓存数据
local areaCache = cache_ngx:get('area_cache_'..key);
-- 判断本地缓存是否为空
if areaCache == "" or areaCache == nil then
local host = "地址"
local password = "密码"
local port = 端口
local database = 数据库
local timeout = 2000
-- 本地缓存为空,向redis中查询
-- 导入redis module
local redis = require("resty.redis");
-- 获取连接对象
local red = redis:new()
-- 设置连接超时时间
red:set_timeout(timeout)
-- redis 的 ip 端口
local ok, err = red:connect(host, port)
-- redis设置的密码
ok, err = red:auth(password)
-- reids连接失败的时候
if not ok then
-- 记录到nginx日志
ngx.log(ngx.DEBUG, "redis connection error:" .. err);
end
red:select(database)
-- 尝试从redis中获取
areaCache = red:hget("hash#area_cache_json", key);
-- 判断redis中的缓存是否为空
if ngx.null ~= areaCache then
-- 在redis中有数据,存入本地缓存,30分钟过期时间
cache_ngx:set('area_cache_'..key, areaCache, 30*60);
end
close_redis(red)
end
-- 设置响应头类型,不设置会返回文件
ngx.header.content_type="application/json;charset=utf8"
-- 在本地缓存中有数据,直接输出
ngx.say(areaCache)
3. Nginx 业务代码直接取Redis缓存
server
{
...
# 查询Redis的Lua脚本
location /redis {
# 如果使用阿里云Redis 需要配置resolver
resolver 8.8.8.8;
# 酌情考虑是否需要跨域
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
# Lua脚本
content_by_lua_file /www/server/nginx/scripts/get_redis.lua;
}
...
}