使用 Redis 实现真正的“滑动窗口”限流,最经典且最合适的数据结构是 ZSET(有序集合)。 相比于简单的 + (固定窗口,存在临界点突发流量问题),滑动窗口可以精确控制任意连续的 60 秒内请求次数不超过 5 次。 以下是完整的实现思路、Lua 脚本和代码示例。 --- 一、 核心设计思路 利用 Redis 的 : Key:构造带有 IP 的标识,例如 。 Score:当前请求的时间戳(毫秒级)。 Member:保证唯一性,通常用 或 。 执行流程(每次请求到来时): 1. 清理过期数据:移除 ZSET 中 小于 的记录。 2. 统计当前数量:获取 ZSET 中剩余的元素个数。 3. 判断是否限流: 如果个数 ,则拒绝请求。 如果个数 ,则将当前请求的时间戳作为 Score 写入 ZSET,并放行。 4. 设置过期时间:为这个 Key 设置 60 秒的过期时间(防止冷数据占用内存)。 --- 二、 为什么必须用 Lua 脚本? 在并发场景下,上述的 4 个步骤必须是原子操作。如果通过代码多次调用 Redis,可能会发生竞态条件(Race Condition),导致超发。Re...