MST
星途 面试题库

面试题:Redis限流熔断机制中如何初步设定阈值

在Redis限流熔断机制里,假设应用场景是限制某个接口每分钟的请求次数,服务器平均处理能力为每秒10个请求,且有一定的突发流量容忍度,你如何初步设定限流阈值?请阐述你的思考过程及可能用到的Redis数据结构和命令。
33.3万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试
  1. 思考过程
    • 服务器平均处理能力为每秒10个请求,那么每分钟理论处理能力为(10\times60 = 600)个请求。
    • 考虑到有一定的突发流量容忍度,我们可以适当提高限流阈值。比如提高20%(这个比例可根据实际业务调整),则限流阈值初步设定为(600\times(1 + 20%) = 720)次/分钟。
  2. Redis数据结构和命令
    • 数据结构:可以使用Redis的计数器,这里适合用INCR命令结合SET命令来实现简单的计数器,使用KEY来标识每个接口的限流情况,例如接口名为/api/some - api,则KEY可以是rate_limit:/api/some - api。也可以使用Redis的有序集合(Sorted Set),在一些更复杂的限流场景(如滑动窗口限流)中,有序集合可记录每个请求的时间戳等信息。
    • 命令
      • INCR和SET命令
        • 首先使用SETNXSET if Not eXists)命令来初始化计数器。例如SETNX rate_limit:/api/some - api 0,如果键不存在则设置初始值为0,返回1;如果键已存在则不做任何操作,返回0。
        • 然后使用INCR命令对计数器进行递增,INCR rate_limit:/api/some - api,每次请求该接口时执行此命令。
        • 可以结合EXPIRE命令设置键的过期时间为1分钟,即每次请求时如果键不存在则设置初始值并设置过期时间,如:
          SETNX rate_limit:/api/some - api 0
          EXPIRE rate_limit:/api/some - api 60
          INCR rate_limit:/api/some - api
          
        • 在每次请求时检查计数器的值,如果超过720则进行限流处理。
      • 有序集合(Sorted Set)相关命令(滑动窗口限流场景下)
        • 使用ZADD命令将请求时间戳添加到有序集合中,例如ZADD rate_limit:/api/some - api <时间戳> <时间戳>
        • 使用ZRANGEBYSCORE命令获取指定时间窗口内的请求数量,如ZRANGEBYSCORE rate_limit:/api/some - api - inf <当前时间戳 - 60秒> WITHSCORES,通过计算返回的元素个数来判断是否超过限流阈值。