MST

星途 面试题库

面试题:Redis滑动窗口限流中有序集合的基本操作及原理

在Redis滑动窗口限流场景下,有序集合(Sorted Set)通常用于记录请求的时间戳等信息。请阐述有序集合在这种场景下常用的操作,如添加元素、获取元素范围等,并且说明这些操作是如何辅助实现滑动窗口限流的原理。
41.1万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

添加元素

在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})

获取元素范围

  1. 根据分数范围获取元素:使用ZRANGEBYSCORE命令获取指定分数(时间戳)范围内的元素。例如,要获取滑动窗口内的所有请求,即获取当前时间往前一段时间内的请求。假设滑动窗口时间为60秒,当前时间为now,则获取now - 60now时间范围内的请求。示例代码如下:
current_timestamp = r.time()[0]
start_time = current_timestamp - 60
requests_in_window = r.zrangebyscore('request_timestamps', start_time, current_timestamp)
  1. 根据排名范围获取元素:在某些情况下,也可能会根据排名获取元素,如ZRANGE命令获取排名在一定范围内的元素。不过在滑动窗口限流场景中,按分数范围获取更常用。

辅助实现滑动窗口限流的原理

  1. 统计请求数量:通过获取滑动窗口内的元素数量(即len(requests_in_window)),可以知道在该时间段内的请求次数。如果请求次数超过设定的限流阈值,则拒绝后续请求,实现限流。
  2. 窗口滑动:随着时间推移,新的请求不断进入,旧的请求超出滑动窗口范围。每次获取元素范围时,都是基于当前时间动态计算滑动窗口的起始时间,从而实现窗口的滑动。当新请求到来添加元素时,也不断更新有序集合中的数据,保证有序集合始终记录着最新的请求时间信息,为滑动窗口限流提供准确的数据支持。