面试题答案
一键面试- 使用Redis的计数器实现流量控制:
- 数据结构:使用Redis的字符串(
string
)数据结构来存储计数器的值。 - 相关命令:
INCR
:用于对计数器进行原子性的递增操作。例如,每次接收到一条消息,执行INCR key
,其中key
是代表该类消息计数器的键。如果键不存在,INCR
会先将其初始化为0然后再递增。EXPIRE
:设置计数器键的过期时间,以实现每秒重置计数器。例如,执行EXPIRE key 1
,表示设置key
在1秒后过期,这样每秒计数器都会重置。
- 实现逻辑:
- 每次接收到一条消息,先执行
INCR key
,获取当前计数器的值。 - 检查计数器的值是否超过100,如果超过则拒绝处理该消息;如果未超过,则正常处理消息。
- 每次接收到一条消息,先执行
- 数据结构:使用Redis的字符串(
- 使用Redis的滑动窗口算法实现更精确的流量控制(可选):
- 数据结构:
- 有序集合(
Sorted Set
):用于记录消息的接收时间。有序集合的成员(member
)可以是消息的唯一标识,分数(score
)是消息的接收时间戳。
- 有序集合(
- 相关命令:
ZADD
:用于向有序集合中添加成员及其分数。例如,ZADD key timestamp message_id
,表示将message_id
的消息以当前时间戳timestamp
作为分数添加到有序集合key
中。ZCOUNT
:用于统计有序集合中指定分数范围内的成员数量。例如,ZCOUNT key (timestamp - 1) timestamp
,可以统计过去1秒内接收的消息数量。这里(timestamp - 1)
是1秒前的时间戳,timestamp
是当前时间戳。
- 实现逻辑:
- 每次接收到一条消息,先使用
ZADD
将消息添加到有序集合中,记录其接收时间。 - 通过
ZCOUNT
统计过去1秒内接收的消息数量,如果超过100条则拒绝处理该消息;否则正常处理消息。
- 每次接收到一条消息,先使用
- 数据结构: