目前项目中经常出现同时重复提交游戏(由gameid
和server定义一个游戏)的问题,试解决如下,不清楚是不是搞定,请各位大侠帮忙看下(主要是不太清楚watch 是怎么用的):
local game_id = server..gameid.."lock"
local redis = redis_connect("set")
-- watch 一个变量
redis:watch(game_id)
-- 开始transaction 队列
local ok, err = redis:multi()
if not ok then
ngx.say("failed to run multi: ", err)
return
end
--在队列里面判断watch的变量是否赋值
if redis:get(game_id) ==1 then
--如果赋值就退出transaction
local execResult,errMsg = redis:discard()
redis:redis_recycle(redis)
return
end
--否则设置watch的变量(因为重复提交只会在短时间出现所以此变量可设置过期)
redis:setex(game_id,3600,1)
local execResult,errMsg = redis:exec()--add redis exec
redis:redis_recycle(redis)