简单的限流方案
阅读 10
有时,在Web服务器中,我们需要对某一个特殊接口或功能进行限流。
比如:在1个小时内,最多调用某个功能不超过5次。
简单的做法
一种简单的做法是使用队列,代码如下:
// 滑动时间窗口队列
const feishuSendTimes = []
canSendFeishu = () => {
const now = Date.now()
const HOUR = 60 * 60 * 1000
const windowStart = now - HOUR
// 删除一个小时以前的记录
while (feishuSendTimes.length > 0 && feishuSendTimes[0] <= windowStart) {
feishuSendTimes.shift()
}
// 60分钟内最多发送5次
if (feishuSendTimes.length >= 5) {
return false
}
// 记录本次发送
feishuSendTimes.push(now)
return true
}上面代码中,我们定义了一个 feishuSendTimes,它是一个“按时间排序的滑动时间窗口队列”。它里面保存的是历史发送时间戳:

这种方式非常简洁,没有额外依赖,就是一个数组。缺点就是 Node.js 进程重启后,数组中的数据会清空。 如果不能忍受这个统计次数因为重启后丢失,可以使用 Redis 的ZSet 来做。
最后编辑于: 2026-08-20