跳到主要内容

固定窗口计数器

2025年01月06日
柏拉文
越努力,越幸运

一、认识


固定窗口限流 将时间划分为固定大小的时间段(如每分钟、每秒),在每个时间段内限制请求次数。当进入下一个时间段时,计数器会重置。具体步骤为: 在 Redis 中为每个用户或操作创建一个计数器键,键名包含时间窗口标识(如时间戳)。当用户发起请求时, 如果键不存在,则创建键并设置初始值为 1,并设置过期时间(等于窗口时长)。如果键已存在,则递增计数器。如果计数器值超过限制,拒绝请求。在固定时间窗口中,限流逻辑可能会出现的问题为: 如果窗口周期结束,计数会立即重置,可能导致流量突增。例如,某 API 每分钟限流 100 次,可能在最后一秒发送 100 次请求,而在下一秒又发送 100 次请求,导致 200 次请求集中在 2 秒内完成。对于精度要求较高的场景,这种计数方式可能不够精确。

二、Node.js


三、Lua 脚本


四、Pipeline


如果并发量高,可以通过 Redis Pipeline 批量执行命令,减少网络开销。

五、Lua Node.js


六、Pipeline Node.js


如果并发量高,可以通过 Redis Pipeline 批量执行命令,减少网络开销。