Redis之zset实现滑动窗口限流
import redis
import time
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 滑动窗口限流的实现
def is_rate_limited(key, max_requests, window_size):
# 计算窗口结束时间
window_end = time.time() + window_size
# 记录请求次数并设置过期时间
requests = r.incr(key)
r.expire(key, window_size)
# 如果请求次数超过了限制,返回True表示被限流
if requests > max_requests:
return True
# 如果在窗口内第一次达到限制,计算剩余时间
if requests == max_requests:
return window_end - time.time()
# 没有超过限制,返回False
return False
# 使用示例
key = 'user_123' # 用户标识
max_requests = 10 # 时间窗口内最大请求次数
window_size = 60 # 时间窗口大小,单位秒
# 检查是否需要限流
sleep_time = is_rate_limited(key, max_requests, window_size)
if sleep_time:
print(f"请求过于频繁,请于{sleep_time}秒后再试。")
else:
print("请求被接受。")
这段代码使用Redis的键值功能实现了一个简单的滑动窗口限流器。它通过记录用户的请求次数,并设置一个有效期来管理时间窗口。如果请求次数超过限制,则进行限流。
评论已关闭