基于Redis的分布式限流详解
import redis
import time
# 连接Redis
pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
redis_cli = redis.Redis(connection_pool=pool)
def is_action_allowed(key, max_count, duration):
# 获取当前时间戳
now = int(time.time())
# 获取该key在duration时间内的调用次数
count = redis_cli.zcard(key)
# 如果调用次数超过最大限制,则不允许执行操作
if count >= max_count:
return False
else:
# 将当前时间戳插入到sorted set,以时间戳为score
redis_cli.zadd(key, {now: now})
# 移除duration时间内过期的时间戳
redis_cli.zremrangebyscore(key, 0, now - duration)
return True
# 使用示例
max_calls = 10
seconds = 60
key = "rate_limit:signature"
if is_action_allowed(key, max_calls, seconds):
print("Action is allowed. Enjoy your API call.")
else:
print("Action is not allowed. Try again later.")
这段代码使用Redis的sorted set数据结构来实现一个简单的分布式限流器。它通过记录时间戳并根据时间窗口大小来限制操作的执行频率。如果在指定的时间窗口内执行的次数超过最大限制,则后续的调用会被限制。这个方法比使用计数器更为灵活,因为它允许在指定的时间窗口内平滑地调整调用频率。
评论已关闭