面试题答案
一键面试Redis固定窗口限流基本原理
固定窗口限流是将时间划分为固定长度的时间窗口,在每个窗口内,对请求进行计数。当请求到达时,检查当前窗口内的请求计数是否超过设定的阈值。如果未超过,则允许请求通过,并将计数加一;若超过,则限制请求,返回限流提示。在每个新的时间窗口开始时,计数重置为零。
使用Redis实现某API接口每分钟最多允许同一用户访问100次的固定窗口限流策略
- 使用的Redis数据结构:使用Redis的
INCR
命令结合EXPIRE
命令来实现。INCR
用于原子性地增加计数器的值,EXPIRE
用于设置键的过期时间,以实现时间窗口的效果。 - 示例代码(以Python为例):
import redis
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
def is_allowed(user_id):
key = f'user:{user_id}:api_count'
# 使用INCR命令原子性地增加计数
count = r.incr(key)
if count == 1:
# 如果是第一次访问,设置过期时间为1分钟(60秒)
r.expire(key, 60)
# 判断是否超过限制
if count > 100:
return False
return True
- 解释:
- 每次API请求到达时,调用
is_allowed
函数,传入用户ID。 - 函数内部构造一个以用户ID为标识的键
user:{user_id}:api_count
。 - 使用
r.incr(key)
原子性地增加计数器的值,并返回增加后的值count
。 - 如果
count
为1,说明这是该用户在当前窗口的第一次请求,使用r.expire(key, 60)
设置该键在60秒后过期,即实现了1分钟的时间窗口。 - 最后判断
count
是否超过100,如果超过则返回False
表示请求被限流,否则返回True
表示请求允许通过。
- 每次API请求到达时,调用