Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. local tokens_key = KEYS[1] -- request_rate_limiter.${id}.tokens 令牌桶剩余令牌数的KEY值
  2. local timestamp_key = KEYS[2] -- 令牌桶最后填充令牌时间的KEY值
  3.  
  4. local rate = tonumber(ARGV[1]) -- replenishRate 令令牌桶填充平均速率
  5. local capacity = tonumber(ARGV[2]) -- burstCapacity 令牌桶上限
  6. local now = tonumber(ARGV[3]) -- 得到从 1970-01-01 00:00:00 开始的秒数
  7. local requested = tonumber(ARGV[4]) -- 消耗令牌数量,默认 1
  8.  
  9. local fill_time = capacity/rate -- 计算令牌桶填充满令牌需要多久时间
  10. local ttl = math.floor(fill_time*2) -- *2 保证时间充足
  11.  
  12.  
  13. local last_tokens = tonumber(redis.call("get", tokens_key))
  14. -- 获得令牌桶剩余令牌数
  15. if last_tokens == nil then -- 第一次时,没有数值,所以桶时满的
  16. last_tokens = capacity
  17. end
  18.  
  19. local last_refreshed = tonumber(redis.call("get", timestamp_key))
  20. -- 令牌桶最后填充令牌时间
  21. if last_refreshed == nil then
  22. last_refreshed = 0
  23. end
  24.  
  25. local delta = math.max(0, now-last_refreshed)
  26. -- 获取距离上一次刷新的时间间隔
  27. local filled_tokens = math.min(capacity, last_tokens+(delta*rate))
  28. -- 填充令牌,计算新的令牌桶剩余令牌数 填充不超过令牌桶令牌上限。
  29.  
  30. local allowed = filled_tokens >= requested
  31. local new_tokens = filled_tokens
  32. local allowed_num = 0
  33. if allowed then
  34. -- 若成功,令牌桶剩余令牌数(new_tokens) 减消耗令牌数( requested ),并设置获取成功( allowed_num = 1 ) 。
  35. new_tokens = filled_tokens - requested
  36. allowed_num = 1
  37. end
  38.  
  39. -- 设置令牌桶剩余令牌数( new_tokens ) ,令牌桶最后填充令牌时间(now) ttl是超时时间?
  40. redis.call("setex", tokens_key, ttl, new_tokens)
  41. redis.call("setex", timestamp_key, ttl, now)
  42.  
  43. -- 返回数组结果
  44. return { allowed_num, new_tokens }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement