MST

星途 面试题库

面试题:Redis固定窗口限流中如何处理窗口边界计数问题

在Redis固定窗口限流场景下,假设窗口时间为1分钟,限制请求次数为100次。当窗口边界临近时,如何准确地对请求计数,以确保限流的准确性?请描述实现思路及可能用到的Redis命令。
43.5万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 使用Redis的有序集合(Sorted Set)数据结构来记录请求的时间戳。
    • 每来一个请求,将当前时间戳(精确到毫秒等合适精度)作为分数,一个唯一标识(如请求ID等)作为成员添加到有序集合中。
    • 当请求到达时,首先计算窗口边界,即当前时间往前推1分钟。
    • 然后根据窗口边界,从有序集合中移除早于窗口开始时间的记录。
    • 最后统计有序集合中的元素个数,若小于等于100,则允许请求通过,否则限流。
  2. 可能用到的Redis命令
    • ZADD:用于将当前请求时间戳和唯一标识添加到有序集合中。例如:ZADD key score member,这里key是有序集合的键,score是当前请求时间戳,member是请求的唯一标识。
    • ZREMRANGEBYSCORE:用于移除有序集合中早于窗口开始时间的记录。命令格式为:ZREMRANGEBYSCORE key min max,其中min为负无穷,max为窗口开始时间的时间戳。
    • ZCARD:用于统计有序集合中的元素个数。命令为:ZCARD key,返回有序集合key中的元素数量,以此判断是否超过限流次数。