实现自适应滑动窗口限流算法
基于用户行为自适应调整速率限制,防止恶意访问但不影响正常用户。 · 难度:入门 · +10XP
自适应动态限流器
DRF内置限流使用固定窗口,本教程教你用Redis实现滑动窗口,并根据用户历史行为(如失败登录次数、请求间隔)动态调整阈值。例如:如果用户连续5次登录失败,则将其限流阈值从100次/分钟降为10次/分钟,恢复后逐渐回升。你将编写一个继承BaseThrottle的自定义类,重写allow_request和wait方法,并在其中计算动态权重。
from rest_framework.throttling import BaseThrottle
import redis
class AdaptiveThrottle(BaseThrottle):
def __init__(self):
self.redis = redis.Redis()
self.base_rate = 100 # 默认每分钟100次
def allow_request(self, request, view):
user_id = request.user.id
current_window = int(time.time() // 60)
key = f'throttle_{user_id}_{current_window}'
count = self.redis.incr(key)
self.redis.expire(key, 60)
# 获取动态阈值
penalty = self.redis.get(f'penalty_{user_id}') or 0
dynamic_rate = self.base_rate - int(penalty)
return count <= dynamic_rate
def wait(self):
return 30