lock_data.lua 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. ---
  2. --- 业务锁定
  3. --- 键值为key,参数为通过eval传递的数组
  4. ---
  5. function string:split(sep)
  6. local sep, fields = sep or ",", {};
  7. local pattern = string.format("([^%s]+)", sep);
  8. self:gsub(pattern, function(c) fields[#fields+1] = c end);
  9. return fields;
  10. end;
  11. local key = KEYS[1]
  12. local keyUser = KEYS[2]
  13. local user = tonumber(ARGV[1])
  14. --- op = 0 锁定 op = 1 解锁
  15. local op = tonumber(ARGV[2])
  16. local idStr = ARGV[3]
  17. local idArr = idStr:split()
  18. ---unpack如果报错,可能是redis集成的lua版本问题,可改为table.unpack
  19. local vals = redis.call("HMGET", key, unpack(idArr))
  20. local result = {}
  21. result['error'] = 0
  22. result['errorMsg'] = ''
  23. ---需要判断两种情况,1返回值为空键值不存在 2返回的所有值都为空,表示无人锁定
  24. if (next(vals) == nil) then
  25. if (op == 0) then
  26. ---整个都为空,理论为键值不存在 表示无人锁定
  27. local newTable = {}
  28. local newTableUser = {}
  29. local i = 1
  30. for k, v in pairs(idArr) do
  31. newTable[i] = v;
  32. newTable[i + 1] = tostring(user)
  33. newTableUser[i] = tostring(v) .. "-" .. tostring(user) .. "-0"
  34. newTableUser[i + 1] = "1"
  35. i = i + 2
  36. end
  37. redis.call("HMSET", key, unpack(newTable))
  38. redis.call("HMSET", keyUser, unpack(newTableUser))
  39. ---返回所有id
  40. result['successIds'] = idArr
  41. result['realSuccessIds'] = idArr
  42. result['failIds'] = { };
  43. else
  44. --- 解锁时,无人锁定
  45. result['error'] = 1
  46. result['errorMsg'] = '无锁定数据'
  47. result['successIds'] = {}
  48. result['realSuccessIds'] = {}
  49. result['failIds'] = idArr
  50. end
  51. return cjson.encode(result);
  52. else
  53. ---可锁定ids
  54. local waitSuccessLockIds = {};
  55. local waitRealSuccessLockIds = {};
  56. local waitFailLockIds = {};
  57. ---可解锁ids
  58. local waitSuccessDelIds = {};
  59. local waitSuccessDelUserIds = {};
  60. local waitFailDelIds = {};
  61. for k, v in pairs(vals) do
  62. if (v == false) then
  63. ---表示不存在此值,即数据未锁定
  64. if (op == 0) then
  65. waitSuccessLockIds[#waitSuccessLockIds + 1] = idArr[k];
  66. waitRealSuccessLockIds[#waitRealSuccessLockIds + 1] = idArr[k];
  67. else
  68. waitFailDelIds[#waitFailDelIds + 1] = idArr[k];
  69. end
  70. else
  71. if (op == 0) then
  72. ---锁定情况下 表示有值,但需要做进一步判断是否锁定人和传入的操作人不同
  73. if (tonumber(v) ~= user) then
  74. waitFailLockIds[#waitFailLockIds + 1] = idArr[k];
  75. else
  76. waitSuccessLockIds[#waitSuccessLockIds + 1] = idArr[k];
  77. end
  78. else
  79. ---解锁情况下 表示有值,但需要做进一步判断是否锁定人和传入的操作人不同
  80. if (tonumber(v) == user) then
  81. waitSuccessDelIds[#waitSuccessDelIds + 1] = idArr[k];
  82. waitSuccessDelUserIds[#waitSuccessDelUserIds + 1] = tostring(idArr[k]) .. "-" .. tostring(user) .. "-0"
  83. else
  84. waitFailDelIds[#waitFailDelIds + 1] = idArr[k];
  85. end
  86. end
  87. end
  88. end
  89. if (op == 0) then
  90. if (next(waitSuccessLockIds) ~= nil) then
  91. local newTable = {}
  92. local newTableUser = {}
  93. local i = 1
  94. for k, v in pairs(waitSuccessLockIds) do
  95. newTable[i] = v;
  96. newTable[i + 1] = tostring(user)
  97. newTableUser[i] = tostring(v) .. "-" .. tostring(user) .. "-0"
  98. newTableUser[i + 1] = "1"
  99. i = i + 2
  100. end
  101. redis.call("HMSET", key, unpack(newTable))
  102. redis.call("HMSET", keyUser, unpack(newTableUser))
  103. result['error'] = 0
  104. result['errorMsg'] = ''
  105. result['successIds'] = waitSuccessLockIds
  106. result['realSuccessIds'] = waitRealSuccessLockIds
  107. result['failIds'] = waitFailLockIds
  108. else
  109. result['error'] = 1
  110. result['errorMsg'] = '无可锁定数据'
  111. result['successIds'] = waitSuccessLockIds
  112. result['realSuccessIds'] = waitRealSuccessLockIds
  113. result['failIds'] = waitFailLockIds
  114. end
  115. return cjson.encode(result);
  116. else
  117. if (next(waitSuccessDelIds) ~= nil) then
  118. redis.call("HDEL", key, unpack(waitSuccessDelIds))
  119. redis.call("HDEL", keyUser, unpack(waitSuccessDelUserIds))
  120. result['error'] = 0
  121. result['errorMsg'] = ''
  122. result['successIds'] = waitSuccessDelIds
  123. result['realSuccessIds'] = waitSuccessDelIds
  124. result['failIds'] = waitFailDelIds
  125. else
  126. result['error'] = 1
  127. result['errorMsg'] = '无可解锁数据'
  128. result['successIds'] = waitSuccessDelIds
  129. result['realSuccessIds'] = waitSuccessDelIds
  130. result['failIds'] = waitFailDelIds
  131. end
  132. return cjson.encode(result);
  133. end
  134. end