redis使用lua脚本防止并发修改redis数据解决脚本

local function Split(szFullString, szSeparator)  
local nFindStartIndex = 1  
local nSplitIndex = 1  
local nSplitArray = {}  
while true do  
   local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)  
   if not nFindLastIndex then  
    nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))  
    break  
   end  
   nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)  
   nFindStartIndex = nFindLastIndex + string.len(szSeparator)  
   nSplitIndex = nSplitIndex + 1  
end  
return nSplitArray  
end
-- 请求参数4个值,第一个:key,第二个:要设置的值,第三个:签名值
-- 设置值的时候先获取值,验证是否相等,如果相等就返回错误,让客户端重新获取然后设置,并且设置时间,如果时间是小于key里面的时间,那么就是错误的值
local result = redis.call('get', KEYS[1])
-- 如果没有设置过,就直接设置值
if (not result) then 
    return redis.call('set', KEYS[1], ARGV[1])
end
-- 取出时间
local timesResult = Split(result, ',')[2]
-- 如果传进来的参数和获取到的一样,那么就重新获取
if (timesResult == ARGV[2]) then
    return redis.call('set', KEYS[1], ARGV[1])
else
    return 0
end

 

你可能感兴趣的:(redis,lua)