面试题答案
一键面试固定窗口限流基本原理
固定窗口限流是一种简单的限流策略。它将时间划分为固定大小的窗口,在每个窗口内,允许通过的请求数量是固定的。当请求到达时,检查当前窗口内已通过的请求数量,如果未超过设定的阈值,则允许请求通过,同时将当前窗口内的请求计数加一;若已超过阈值,则拒绝请求。
基于Redis的Python代码示例
import redis
import time
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
def fixed_window_rate_limit(key, capacity, window):
current_time = int(time.time())
window_start = current_time - current_time % window
# 使用Redis的INCRBY命令增加计数
count = r.incrby(key, 1)
if count == 1:
# 设置键的过期时间,以确保窗口时间到期后计数器重置
r.expireat(key, window_start + window)
if count > capacity:
return False
return True
# 示例调用
for _ in range(150):
if fixed_window_rate_limit('request_count', 100, 60):
print("请求通过")
else:
print("请求被限流")
代码说明
- 连接Redis:使用
redis.Redis
方法连接到本地Redis服务。 fixed_window_rate_limit
函数:- 计算当前窗口的起始时间
window_start
。 - 使用
r.incrby
方法增加请求计数,并获取当前计数count
。 - 如果计数为1,说明这是当前窗口的第一个请求,设置键的过期时间为窗口结束时间。
- 检查计数是否超过容量
capacity
,如果超过则返回False
,表示请求被限流;否则返回True
,表示请求通过。
- 计算当前窗口的起始时间
- 示例调用:通过循环模拟150次请求,调用限流函数并打印结果。