redisBucket.lua 968 B

12345678910111213141516171819202122232425262728293031323334353637
  1. --KEY值
  2. local key=KEYS[1]
  3. --桶容量
  4. local buketSize=tonumber(KEYS[2])
  5. --令牌产出时间
  6. local rate=ARGV[1]
  7. --此次更新时间
  8. local UpdateTime=ARGV[2]
  9. --var为集合,剩余令牌数量【1】,更新时间【2】
  10. local remain = tonumber(redis.call("hget",key,"remainToken"))
  11. local lastRefreshTime=redis.call("hget",key,"lastRefreshTime")
  12. --首次创建
  13. if type(remain)=="nil"
  14. then
  15. remain=math.ceil(buketSize/2)
  16. redis.call("hset",key,"lastRefreshTime",UpdateTime)
  17. redis.call("hset",key,"remainToken",remain)
  18. lastRefreshTime=UpdateTime
  19. end
  20. if(remain<=0)
  21. then
  22. local newTokens=math.ceil((UpdateTime-lastRefreshTime)/rate)
  23. local refreshToken=newTokens
  24. if(refreshToken<=0)
  25. then
  26. return 0
  27. end
  28. if(refreshToken>buketSize)
  29. then
  30. refreshToken=buketSize
  31. end
  32. redis.call("hset",key,"lastRefreshTime",UpdateTime)
  33. redis.call("hset",key,"remainToken",refreshToken)
  34. else
  35. redis.call("hset",key,"remainToken",remain-1)
  36. end
  37. return 1