redis限流的代码实现
时间: 2023-10-12 20:21:23 浏览: 97
好的,以下是一个简单的 Redis 限流实现的代码示例:
```python
import redis
import time
# 连接 Redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
# 定义限流函数
def is_action_allowed(user_id, action_key, period, max_count):
key = f'hist:{user_id}:{action_key}' # 定义 Redis 键
now = time.time() # 获取当前时间
p = r.pipeline() # 初始化 Redis 管道
p.multi() # 进入 Redis 事务模式
p.zadd(key, {now: now}) # 将当前时间作为分值和值添加到有序集合中
p.zremrangebyscore(key, 0, now - period) # 移除区间外的成员
p.zcard(key) # 获取当前有序集合的成员数量
p.expire(key, period + 1) # 设置过期时间
count, _, _ = p.execute() # 获取执行结果并保存计数器的值
return count <= max_count # 判断计数器是否超过限制
```
以上代码中,用到了 Redis 的有序集合来进行限流,每个用户和操作都对应一个键,键中保存一个时间戳作为分值和值,使用 Redis 管道实现原子操作,保证了并发情况下的数据安全性和效率。
如果需要使用这个函数来限制一个用户在一分钟内最多发出10次请求,可以像下面这样调用:
```python
if is_action_allowed('user123', 'request', 60, 10):
# 允许请求
else:
# 拒绝请求
```
这个函数的参数含义如下:
- `user_id`: 用户 ID,用于区分不同用户的请求。
- `action_key`: 操作键,用于区分不同类型的请求。
- `period`: 限流时间窗口大小,以秒为单位。
- `max_count`: 限流时间窗口内最大可允许的请求数量。
阅读全文