Openrestry+Lua+Redis直接查询缓存

Openrestry+Lua+Redis直接查询缓存

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 {
        # 酌情考虑是否需要跨域
        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;
    }
    ...
}

本文由 在码圈 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!
原文链接:https://www.bedebug.com/archives/openrestryluaredis
最后更新于:2022-02-22 18:17:19

请博主喝咖啡 ☕.