面试题答案
一键面试添加元素
在Redis中,使用ZADD
命令向有序集合添加元素。例如,当一个请求到达时,将当前时间戳作为分数,一个唯一标识(如请求ID)作为成员添加到有序集合中。示例代码如下(以Python的redis-py库为例):
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
current_timestamp = r.time()[0] # 获取当前时间戳
request_id = 'request_1'
r.zadd('request_timestamps', {request_id: current_timestamp})
获取元素范围
- 根据分数范围获取元素:使用
ZRANGEBYSCORE
命令获取指定分数(时间戳)范围内的元素。例如,要获取滑动窗口内的所有请求,即获取当前时间往前一段时间内的请求。假设滑动窗口时间为60秒,当前时间为now
,则获取now - 60
到now
时间范围内的请求。示例代码如下:
current_timestamp = r.time()[0]
start_time = current_timestamp - 60
requests_in_window = r.zrangebyscore('request_timestamps', start_time, current_timestamp)
- 根据排名范围获取元素:在某些情况下,也可能会根据排名获取元素,如
ZRANGE
命令获取排名在一定范围内的元素。不过在滑动窗口限流场景中,按分数范围获取更常用。
辅助实现滑动窗口限流的原理
- 统计请求数量:通过获取滑动窗口内的元素数量(即
len(requests_in_window)
),可以知道在该时间段内的请求次数。如果请求次数超过设定的限流阈值,则拒绝后续请求,实现限流。 - 窗口滑动:随着时间推移,新的请求不断进入,旧的请求超出滑动窗口范围。每次获取元素范围时,都是基于当前时间动态计算滑动窗口的起始时间,从而实现窗口的滑动。当新请求到来添加元素时,也不断更新有序集合中的数据,保证有序集合始终记录着最新的请求时间信息,为滑动窗口限流提供准确的数据支持。