| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- ---
- --- 业务锁定
- --- 键值为key,参数为通过eval传递的数组
- ---
- function string:split(sep)
- local sep, fields = sep or ",", {};
- local pattern = string.format("([^%s]+)", sep);
- self:gsub(pattern, function(c) fields[#fields+1] = c end);
- return fields;
- end;
- local key = KEYS[1]
- local keyUser = KEYS[2]
- local user = tonumber(ARGV[1])
- --- op = 0 锁定 op = 1 解锁
- local op = tonumber(ARGV[2])
- local idStr = ARGV[3]
- local idArr = idStr:split()
- ---unpack如果报错,可能是redis集成的lua版本问题,可改为table.unpack
- local vals = redis.call("HMGET", key, unpack(idArr))
- local result = {}
- result['error'] = 0
- result['errorMsg'] = ''
- ---需要判断两种情况,1返回值为空键值不存在 2返回的所有值都为空,表示无人锁定
- if (next(vals) == nil) then
- if (op == 0) then
- ---整个都为空,理论为键值不存在 表示无人锁定
- local newTable = {}
- local newTableUser = {}
- local i = 1
- for k, v in pairs(idArr) do
- newTable[i] = v;
- newTable[i + 1] = tostring(user)
- newTableUser[i] = tostring(v) .. "-" .. tostring(user) .. "-0"
- newTableUser[i + 1] = "1"
- i = i + 2
- end
- redis.call("HMSET", key, unpack(newTable))
- redis.call("HMSET", keyUser, unpack(newTableUser))
- ---返回所有id
- result['successIds'] = idArr
- result['realSuccessIds'] = idArr
- result['failIds'] = { };
- else
- --- 解锁时,无人锁定
- result['error'] = 1
- result['errorMsg'] = '无锁定数据'
- result['successIds'] = {}
- result['realSuccessIds'] = {}
- result['failIds'] = idArr
- end
- return cjson.encode(result);
- else
- ---可锁定ids
- local waitSuccessLockIds = {};
- local waitRealSuccessLockIds = {};
- local waitFailLockIds = {};
- ---可解锁ids
- local waitSuccessDelIds = {};
- local waitSuccessDelUserIds = {};
- local waitFailDelIds = {};
- for k, v in pairs(vals) do
- if (v == false) then
- ---表示不存在此值,即数据未锁定
- if (op == 0) then
- waitSuccessLockIds[#waitSuccessLockIds + 1] = idArr[k];
- waitRealSuccessLockIds[#waitRealSuccessLockIds + 1] = idArr[k];
- else
- waitFailDelIds[#waitFailDelIds + 1] = idArr[k];
- end
- else
- if (op == 0) then
- ---锁定情况下 表示有值,但需要做进一步判断是否锁定人和传入的操作人不同
- if (tonumber(v) ~= user) then
- waitFailLockIds[#waitFailLockIds + 1] = idArr[k];
- else
- waitSuccessLockIds[#waitSuccessLockIds + 1] = idArr[k];
- end
- else
- ---解锁情况下 表示有值,但需要做进一步判断是否锁定人和传入的操作人不同
- if (tonumber(v) == user) then
- waitSuccessDelIds[#waitSuccessDelIds + 1] = idArr[k];
- waitSuccessDelUserIds[#waitSuccessDelUserIds + 1] = tostring(idArr[k]) .. "-" .. tostring(user) .. "-0"
- else
- waitFailDelIds[#waitFailDelIds + 1] = idArr[k];
- end
- end
- end
- end
- if (op == 0) then
- if (next(waitSuccessLockIds) ~= nil) then
- local newTable = {}
- local newTableUser = {}
- local i = 1
- for k, v in pairs(waitSuccessLockIds) do
- newTable[i] = v;
- newTable[i + 1] = tostring(user)
- newTableUser[i] = tostring(v) .. "-" .. tostring(user) .. "-0"
- newTableUser[i + 1] = "1"
- i = i + 2
- end
- redis.call("HMSET", key, unpack(newTable))
- redis.call("HMSET", keyUser, unpack(newTableUser))
- result['error'] = 0
- result['errorMsg'] = ''
- result['successIds'] = waitSuccessLockIds
- result['realSuccessIds'] = waitRealSuccessLockIds
- result['failIds'] = waitFailLockIds
- else
- result['error'] = 1
- result['errorMsg'] = '无可锁定数据'
- result['successIds'] = waitSuccessLockIds
- result['realSuccessIds'] = waitRealSuccessLockIds
- result['failIds'] = waitFailLockIds
- end
- return cjson.encode(result);
- else
- if (next(waitSuccessDelIds) ~= nil) then
- redis.call("HDEL", key, unpack(waitSuccessDelIds))
- redis.call("HDEL", keyUser, unpack(waitSuccessDelUserIds))
- result['error'] = 0
- result['errorMsg'] = ''
- result['successIds'] = waitSuccessDelIds
- result['realSuccessIds'] = waitSuccessDelIds
- result['failIds'] = waitFailDelIds
- else
- result['error'] = 1
- result['errorMsg'] = '无可解锁数据'
- result['successIds'] = waitSuccessDelIds
- result['realSuccessIds'] = waitSuccessDelIds
- result['failIds'] = waitFailDelIds
- end
- return cjson.encode(result);
- end
- end
|