分布式限流:Redis
在使用Redis实现分布式限流时,可以使用Redis的原子操作INCR和EXPIRE结合使用。以下是一个简单的Python示例,使用redis-py客户端库实现:
import redis
import time
# 连接到Redis
r = redis.Redis(host='localhost', port=6379, db=0)
def is_rate_limited(key, max_requests, time_window):
# 请求数增加
requests = r.incr(key)
# 如果是第一次访问,设置过期时间
if requests == 1:
r.expire(key, time_window)
# 如果请求数超过了最大请求数,则认为被限流
if requests > max_requests:
return True
# 否则,没有被限流
else:
# 计算剩余时间
remaining_time = r.ttl(key)
return False, remaining_time
# 使用示例
key = 'user_123' # 用户标识
max_requests = 10 # 时间窗口内最大请求次数
time_window = 60 # 时间窗口,单位为秒
# 检查是否被限流
is_limited, remaining_time = is_rate_limited(key, max_requests, time_window)
if is_limited:
print(f"被限流,剩余时间:{remaining_time}秒")
else:
print("请求通过")
这段代码定义了一个is_rate_limited
函数,它通过Redis的INCR
命令来增加特定key的请求计数,并设置过期时间来限制在特定时间窗口内的请求次数。如果请求计数超过最大请求数,则返回True
表示被限流,同时返回剩余时间;否则返回False
表示请求通过。
评论已关闭