MST

星途 面试题库

面试题:如何根据业务场景动态调整Redis固定窗口限流算法的窗口大小?

假设你负责一个电商抢购系统,平时流量平稳但抢购期间流量暴增,使用Redis固定窗口限流算法,说明如何根据实时流量、业务规则等因素,动态且合理地调整窗口大小,以保证系统既能应对高并发又能公平分配资源。
14.8万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试
  1. 监控实时流量
    • 使用Redis的命令如INCR统计每个固定窗口内的请求次数。例如,在抢购开始后,每次有请求到达,执行INCR <key><key>可以是基于时间戳的窗口标识。
    • 利用Redis的EXPIRE设置窗口的过期时间,保证窗口的固定性。比如设置一个60秒的窗口,当SET <key> 1 EX 60后,每来一个请求INCR <key>,60秒后该键自动删除,开启新的窗口统计。
  2. 依据业务规则
    • 商品库存:如果商品库存充足,可以适当扩大窗口大小,允许更多请求通过。比如库存有1000件,且当前窗口内只处理了100个请求,可考虑扩大窗口。
    • 抢购时间:在抢购开始初期,流量可能相对较小且平稳,可适当缩小窗口,随着抢购高峰临近,逐步扩大窗口。例如抢购共10分钟,前2分钟窗口设为10秒,之后每2分钟将窗口增加5秒。
  3. 动态调整窗口大小
    • 扩大窗口:当连续多个窗口内请求次数都远低于设定的限流阈值,且业务规则允许时,通过修改EXPIRE时间来扩大窗口。例如原窗口60秒,现调整为90秒,EXPIRE <key> 90
    • 缩小窗口:若窗口内请求次数接近或超过限流阈值,且业务规则提示需严格控制流量时,缩小窗口。如从60秒缩短到30秒,EXPIRE <key> 30
  4. 公平分配资源
    • 基于用户ID哈希:为每个请求的用户ID进行哈希运算,将哈希值与窗口大小取模,得到的结果作为分配资源的依据。例如,窗口大小为100,用户ID哈希值取模后为20,该用户请求在本窗口内获得第20个处理位置。
    • 轮询分配:当窗口调整时,对请求进行轮询分配。比如窗口扩大,新进来的请求依次分配到不同处理队列,保证每个请求都有公平机会被处理。