MST

星途 面试题库

面试题:Redis固定窗口限流原理及简单实现

请阐述Redis固定窗口限流的基本原理,并给出一个基于Redis的简单代码示例来实现固定窗口限流,假设每次请求会消耗一个令牌,令牌桶容量为100,窗口时间为60秒。可使用你熟悉的编程语言。
21.8万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

固定窗口限流基本原理

固定窗口限流是一种简单的限流策略。它将时间划分为固定大小的窗口,在每个窗口内,允许通过的请求数量是固定的。当请求到达时,检查当前窗口内已通过的请求数量,如果未超过设定的阈值,则允许请求通过,同时将当前窗口内的请求计数加一;若已超过阈值,则拒绝请求。

基于Redis的Python代码示例

import redis
import time

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

def fixed_window_rate_limit(key, capacity, window):
    current_time = int(time.time())
    window_start = current_time - current_time % window

    # 使用Redis的INCRBY命令增加计数
    count = r.incrby(key, 1)

    if count == 1:
        # 设置键的过期时间,以确保窗口时间到期后计数器重置
        r.expireat(key, window_start + window)

    if count > capacity:
        return False
    return True


# 示例调用
for _ in range(150):
    if fixed_window_rate_limit('request_count', 100, 60):
        print("请求通过")
    else:
        print("请求被限流")

代码说明

  1. 连接Redis:使用redis.Redis方法连接到本地Redis服务。
  2. fixed_window_rate_limit函数
    • 计算当前窗口的起始时间window_start
    • 使用r.incrby方法增加请求计数,并获取当前计数count
    • 如果计数为1,说明这是当前窗口的第一个请求,设置键的过期时间为窗口结束时间。
    • 检查计数是否超过容量capacity,如果超过则返回False,表示请求被限流;否则返回True,表示请求通过。
  3. 示例调用:通过循环模拟150次请求,调用限流函数并打印结果。