MST

星途 面试题库

面试题:Redis固定窗口限流原理及简单业务适配

请阐述Redis固定窗口限流的基本原理。假设业务场景为某API接口每分钟最多允许同一用户访问100次,如何使用Redis实现该固定窗口限流策略?
22.0万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

Redis固定窗口限流基本原理

固定窗口限流是将时间划分为固定长度的时间窗口,在每个窗口内,对请求进行计数。当请求到达时,检查当前窗口内的请求计数是否超过设定的阈值。如果未超过,则允许请求通过,并将计数加一;若超过,则限制请求,返回限流提示。在每个新的时间窗口开始时,计数重置为零。

使用Redis实现某API接口每分钟最多允许同一用户访问100次的固定窗口限流策略

  1. 使用的Redis数据结构:使用Redis的INCR命令结合EXPIRE命令来实现。INCR用于原子性地增加计数器的值,EXPIRE用于设置键的过期时间,以实现时间窗口的效果。
  2. 示例代码(以Python为例)
import redis

# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)

def is_allowed(user_id):
    key = f'user:{user_id}:api_count'
    # 使用INCR命令原子性地增加计数
    count = r.incr(key)
    if count == 1:
        # 如果是第一次访问,设置过期时间为1分钟(60秒)
        r.expire(key, 60)
    # 判断是否超过限制
    if count > 100:
        return False
    return True
  1. 解释
    • 每次API请求到达时,调用is_allowed函数,传入用户ID。
    • 函数内部构造一个以用户ID为标识的键user:{user_id}:api_count
    • 使用r.incr(key)原子性地增加计数器的值,并返回增加后的值count
    • 如果count为1,说明这是该用户在当前窗口的第一次请求,使用r.expire(key, 60)设置该键在60秒后过期,即实现了1分钟的时间窗口。
    • 最后判断count是否超过100,如果超过则返回False表示请求被限流,否则返回True表示请求允许通过。