一个需求:广告数据存在Redis中,它是有时效性的,当Redis中数据失效时,怎么能让本地缓存中的数据同步失效呢
下面是lua脚本
ngx.header.content_type="application/json;charset=utf8"
-- 获取路径上的请求参数,数据类型类似于“map”
local uri_args = ngx.req.get_uri_args();
-- 获取ID参数
local id = uri_args["id"];
-- 声明变量接收Nginx配置文件中定义的共享缓存
local cache_ngx = ngx.shared.dis_cache;
-- 根据key获取本地缓存中的数据
local contentCache = cache_ngx:get('content_cache_'..id);
-- 本地缓存中没有查询到的处理逻辑
if contentCache == "" or contentCache == nil then
-- 引入 redis 模块
local redis = require("resty.redis");
local red = redis:new()
-- 发起 redis 连接
red:set_timeout(2000)
-- 建立连接
local host = "192.168.23.128";
local port = 6379;
local password = "000415";
red:connect(host, port);
red:auth(password);
-- 获取数据
local rescontent=red:get("content_"..id);
-- 从redis中没有获取到数据的逻辑处理
if ngx.null == rescontent then
-- 引入cjson、mysql模块
local cjson = require("cjson");
local mysql = require("resty.mysql");
-- 发起mysql连接
local db = mysql:new();
db:set_timeout(2000)
local mysql_props = {
host = "192.168.23.128",
port = 3306,
database = "cg_business",
user = "root",
password = "root"
}
local res = db:connect(mysql_props);
-- 查询数据
local select_sql = "select url,name,position from tb_content where status ='1' and id="..id;
-- 解决数据库中文乱码问题
db:query("SET NAMES utf8")
res = db:query(select_sql);
-- 编码
local responsejson = cjson.encode(res);
-- 放入Redis并设置生命周期,注意与本地缓存周期一致
red:set("content_"..id,responsejson);
red:expire("content_"..id, 10 * 60);
-- 响应数据
ngx.say(responsejson);
-- 关闭数据库连接
db:close();
else
-- 从Redis中查询到数据后放入本地缓存
cache_ngx:set('content_cache_'..id, rescontent, 10*60);
-- 响应数据
ngx.say(rescontent);
end
red:close();
else
ngx.say(contentCache);
end