面试题答案
一键面试- 思考过程:
- 服务器平均处理能力为每秒10个请求,那么每分钟理论处理能力为(10\times60 = 600)个请求。
- 考虑到有一定的突发流量容忍度,我们可以适当提高限流阈值。比如提高20%(这个比例可根据实际业务调整),则限流阈值初步设定为(600\times(1 + 20%) = 720)次/分钟。
- Redis数据结构和命令:
- 数据结构:可以使用Redis的计数器,这里适合用
INCR
命令结合SET
命令来实现简单的计数器,使用KEY
来标识每个接口的限流情况,例如接口名为/api/some - api
,则KEY
可以是rate_limit:/api/some - api
。也可以使用Redis的有序集合(Sorted Set),在一些更复杂的限流场景(如滑动窗口限流)中,有序集合可记录每个请求的时间戳等信息。 - 命令:
- INCR和SET命令:
- 首先使用
SETNX
(SET 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
,通过计算返回的元素个数来判断是否超过限流阈值。
- 使用
- INCR和SET命令:
- 数据结构:可以使用Redis的计数器,这里适合用