对于请求x,在n秒内,最多请求m次。 (n,m是自然数; x代表请求字符串)

令牌桶算法:

  • 桶容量: m
  • 放令牌速率: 每n秒放m个令牌

Redis key设计

Redis Key 过期时间 Redis 值
request_rate_limiter.n-m.{x}.tokens 2n 桶内剩余令牌数量(默认值:m)
request_rate_limiter.{x}.timestamp 2n 请求x最后请求时间搓(单位秒), (now-last_refreshed)%n

举例

  1. 对于请求x,在30秒内,最多请求50次
  2. 对于请求x,在20秒内,最多请求35次
  3. 对于请求x,在10秒内,最多请求15次

Redis key设计

Redis Key 过期时间 Redis 值
request_rate_limiter.30-50.{x}.tokens 60s 桶内剩余令牌数量: v1
request_rate_limiter.20-35.{x}.tokens 40s 桶内剩余令牌数量: v2
request_rate_limiter.10-15.{x}.tokens 20s 桶内剩余令牌数量: v3
request_rate_limiter.{x}.timestamp 60s 请求x最后请求时间搓(单位秒): last_refreshed

处理请求x限流计数逻辑

当前请求时间搓(单位秒): now

Redis Key 过期时间 Redis 值
request_rate_limiter.30-50.{x}.tokens 60s min(50, v1 + (now-last_refreshed)/30 * 50)) -1
request_rate_limiter.20-35.{x}.tokens 40s min(35, v2 + (now-last_refreshed)/20 * 35)) - 1
request_rate_limiter.10-15.{x}.tokens 20s min(15, v3 + (now-last_refreshed)/10 * 15)) -1
request_rate_limiter.{x}.timestamp 60s [now, (now-last_refreshed)%30, (now-last_refreshed)%20, (now-last_refreshed)%10]
文档更新时间: 2020-11-17 12:06   作者:lizw