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