lua_shared_dict cache 100k;
location = /t {
set $skip 0;
set $key '';
set $srcache_expire '10';
set $access 1;
srcache_fetch GET /memcached key=$key;
srcache_store PUT /memcached key=$key&exptime=$srcache_expire;
srcache_fetch_skip $skip;
srcache_store_skip $skip;
add_header X-Cache-Fetch-Status $srcache_fetch_status;
add_header X-Cache-Store-Status $srcache_store_status;
srcache_response_cache_control off;
content_by_lua_block {
local cache = ngx.shared.cache
local newValue = cache:incr("123",1,0)
ngx.say(newValue)
}
location = /memcached {
content_by_lua_block {
local memcached = require "resty.memcached"
local memc, err = memcached:new()
if not memc then
ngx.log(ngx.ERR, err)
ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)
end
memc:set_timeout(3000)
local ok, err = memc:connect(config["memcached"]["host"], config["memcached"]["port"])
if not ok then
ngx.log(ngx.ERR, err)
ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)
end
local method = ngx.req.get_method()
local key = ngx.var.arg_key
if method == "GET" then
::again::
local res, flags, err = memc:get(key)
if err then
ngx.log(ngx.ERR, err)
ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)
end
if res == nil and flags == nil and err == nil then
local lock, err = memc:add("LOCK:" .. key,"1e68ba3e7b36",30)
if lock then
ngx.log(ngx.ERR, "get lock successed")
ngx.exit(ngx.HTTP_NOT_FOUND)
else
ngx.sleep(0.3)
goto again
end
end
ngx.print(res)
elseif method == "PUT" then
local value = ngx.req.get_body_data()
local expire = ngx.var.arg_exptime
local ok, err = memc:set(key, value, expire)
if not ok then
ngx.log(ngx.ERR, err)
ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)
end
memc:delete("LOCK:" .. key)
else
ngx.exit(ngx.HTTP_NOT_ALLOWED)
end
local ok, err = memc:set_keepalive(10000, 512)
if not ok then
ngx.say("cannot set keepalive: ", err)
return
end
}
}
用wrk测试的时候,每当缓存失效时,都会同时打出两条或是更多的get lock successed