quantity.lua 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. -- 可能回滚的列表,一个记录要回滚的skuid一个记录库存
  2. local id_list= {}
  3. local quantity_list= {}
  4. -- 调用放传递的keys 和 values execute(RedisScript<T> script, List<K> keys, Object... args)
  5. local keys = KEYS
  6. local values = ARGV;
  7. local function deduction(key,num)
  8. keys[1] = key;
  9. local value = redis.call("get",keys[1])
  10. if not value then
  11. value = 0;
  12. end
  13. value = value + num
  14. -- 变更后库存数量小于
  15. if(value<0)
  16. then
  17. -- 发生超卖
  18. return false;
  19. end
  20. redis.call("set",keys[1],value)
  21. return true
  22. end
  23. local function rollback()
  24. for i,k in ipairs (id_list) do
  25. -- 还原库存
  26. keys[1] = k;
  27. redis.call("incrby",keys[1],0-quantity_list[i])
  28. end
  29. end
  30. local function execute()
  31. -- i 类java for循环 for(int i=0;i<?;i++) 下标
  32. -- k 为遍历的值 具体值,非下标
  33. for i, k in ipairs (values)
  34. do
  35. -- num 变更数量
  36. -- key 为缓存key
  37. local num = tonumber(k)
  38. local key= keys[i]
  39. -- 进行库存扣减,为false 代表扣减失败,要进行回滚
  40. local result = deduction(key,num)
  41. -- 回滚
  42. if (result == false)
  43. then
  44. rollback()
  45. return false
  46. else
  47. -- 记录可能要回滚的数据
  48. table.insert(id_list,key)
  49. table.insert(quantity_list,num)
  50. end
  51. end
  52. return true;
  53. end
  54. return execute()