简单的限流方案

阅读 12

有时,在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

评论(0条)

(必填)
复制成功