lock.lua

local rety_lock = require "resty.lock"
local cache = ngx.shared.my_cache
local key = ngx.re.match(ngx.var.request_uri,"/([0-9]+).html")

if type(key) == "table" then
local res,err = cache:get(key[1])
if res then
ngx.say('val res')
return
end
local lock,err = rety_lock:new("my_locks",{exptime=10,timeout=1})
if not lock then
ngx.log(ngx.ERR,'--------------new lock err')
end
local flag_lock,err = lock:lock(key[1])
if err then
ngx.log(ngx.ERR,'--------------lock err')
end
if not flag_lock then
local res = cache:get_stale(key[1])
return res
end

local res,err = cache:get(key[1])
    if res then
	lock:unlock()
            return res
    end
--ngx.sleep(2)


local req_data
local method = ngx.var.request.method
if method == "POST" then
	req_data = {method=ngx.HTTP_POST, body=ngx.req.read_body()}

elseif method == "PUT" then
	req_data = {method=ngx.HTTP_PUT, body=ngx.req.read_body()}

else
	req_data = {method=ngx.HTTP_GET}

end
local res,err = ngx.location.capture(
	'index.php',
	req_data
)
if res.status == 200 then
	ngx.say(res.body)
end
lock:unlock()

end

posted on   木林coder  阅读(195)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示