当前位置: 首页 > article >正文

限流算法详解 - 滑动窗口算法深入理解

滑动窗口算法详解专门针对滑动窗口算法从原理到精确限流的实现细节做一个深入剖析。一、核心思想固定窗口在时间边界处会出现“计数突跳”原因是窗口的边界是硬重置的0→1秒末清空1→2秒初重新计数。滑动窗口的核心改进是窗口不再整段重置而是随当前时间“滑动”始终统计“过去一个完整窗口长度”内的请求总数。大白话你不是只看“这一分钟从0秒到60秒”而是任何时候都回头看“刚才过去的60秒”。即窗口不是固定的 [00:00, 00:60)、[01:00, 02:00) 这样的整分区间而是始终以当前时刻为终点往前推 60 秒。这样就不存在边界漏洞。二、如何做到精确限流精确限流的本质是任意时刻 T系统能够准确统计出[T - windowSize, T)这段时间内的请求数量并且这个统计的计算代价不能太高。滑动窗口通过两种方式实现方式1基于时间片槽位的滑动窗口工程最常用这是对“无穷细粒度滑动”的近似但在工程上可控且高效。数据结构将窗口长度W分成N个等长的小时间片slot每个 slot 对应一个计数器。例如窗口长度 1 秒分成 10 个 slot每个 slot 代表 100 毫秒。算法步骤当请求在时间t到达计算当前 slot 索引slotIndex floor(t / slotDuration) % N如果该 slot 不是当前活跃 slot即时间已经推进到了下一个 slot则清零过时的 slot。将该 slot 的计数器加1。统计当前窗口内的总请求数 所有 N 个 slot 的计数器之和因为窗口恰好覆盖 N 个 slot。如果总和 阈值放行否则拒绝。为什么能精确限流因为任意时刻窗口覆盖的是完整的 N 个连续 slot。当时间从t1移动到t2时滑动算法会逐渐淘汰最老的 slot加入最新的 slot。这避免了固定窗口的“整体重置”问题边界请求被分散到相邻 slot 中不会产生突发尖峰。精度分析误差 ≤slotDuration。比如 slot 100ms最多有 100ms 内的请求可能被统计到稍早或稍晚的窗口边界上但相比固定窗口的整段误差可高达一个完整窗口的突发这个误差很小。N 越大slot 越细限流越精确但内存和计算开销也越大。实际工程中 N10~100 已经很精确。方式2基于有序时间戳集合精确但不高效将所有请求的时间戳存入一个有序集合如 Redis ZSET。每次请求时删除窗口外的过期时间戳ZREMRANGEBYSCORE然后统计集合大小ZCARD。优点理论上完全精确无 slot 量化误差。缺点内存占用随请求量线性增长高并发下性能差。很少用于生产限流更多用于精确分析。三、与固定窗口的对比关键场景固定窗口滑动窗口slot100ms窗口长度 1s阈值 100在第1秒的最后10ms内到达100个请求第2秒的最初10ms内到达100个请求 → 200ms内共200个请求全部放行压垮系统。第1秒最后10ms的请求计入第1秒的第10个slot第2秒最初10ms的请求计入第2秒的第1个slot。窗口滑动后这200ms的请求会被分别归属到两个窗口组合中不会同时出现在同一个1秒窗口因此最多放行100个/秒。是否允许边界突刺严重允许基本消除误差限于 slot 粒度大白话对比固定窗口像是“每过1分钟就清零重算”钻空子的人正好在清零前后狂刷。滑动窗口像是“你有60个收银台每个台负责1秒中的一小段任何时候我只看最近60个台子的总人数”没人能跨过60个台子。四、实际实现示例Redis Lua 的滑动窗口常见的高性能分布式滑动窗口实现伪代码-- KEYS[1] 限流key ARGV[1] 窗口长度(ms) ARGV[2] 阈值 ARGV[3] 当前时间戳(ms)localcurrent_timetonumber(ARGV[3])localwindow_startcurrent_time-tonumber(ARGV[1])-- 删除窗口外的旧请求redis.call(ZREMRANGEBYSCORE,KEYS[1],0,window_start)-- 统计当前窗口内请求数localcurrent_countredis.call(ZCARD,KEYS[1])ifcurrent_counttonumber(ARGV[2])then-- 未超限添加当前请求时间戳redis.call(ZADD,KEYS[1],current_time,current_time.._..math.random())-- 设置过期时间避免内存无限增长redis.call(PEXPIRE,KEYS[1],tonumber(ARGV[1]))return1-- 放行elsereturn0-- 拒绝end这个实现是精确的无 slot 量化因为直接用 ZSET 存储每个请求的时间戳。但它有缺点高并发下 ZSET 的内存和排序开销较大只适合中小规模或需要绝对精确的场景。五、滑动窗口的优缺点总结优点缺点解决固定窗口的边界突发问题实现比固定窗口复杂限流精度可调通过调整 slot 数量需要存储多个 slot 的计数内存高于固定窗口对流量突发有很好的平滑效果如果使用 ZSET 方式性能和内存会随请求线性增长适用分布式场景配合 Redis–六、实际选择建议需要极高精度、流量不大→ 用 ZSET 精确滑动窗口。高并发、可容忍毫秒级误差→ 用 slot 化滑动窗口slot 数 10~100。对边界突发不敏感→ 固定窗口更简单。需要平滑速率 允许突发→ 令牌桶比滑动窗口更合适。大白话总结滑动窗口就像一个滚动的监控摄像头永远盯着刚过去的那个时间区间。它不像固定窗口那样“到点就忘”而是边走边忘——忘掉最老的记住最新的。这样就能精确控制任何时刻的“最近N秒流量”不会被人卡点突击。

相关文章:

限流算法详解 - 滑动窗口算法深入理解

滑动窗口算法详解 专门针对滑动窗口算法,从原理到精确限流的实现细节做一个深入剖析。 一、核心思想 固定窗口在时间边界处会出现“计数突跳”,原因是窗口的边界是硬重置的(0→1秒末清空,1→2秒初重新计数)。 滑动窗口…...

UE5.6低延迟视频推流实战:从采集编码到RTMP传输全链路解析

1. 这不是“加个插件就能播”的事:UE5.6视频流推送的真实战场 很多人看到“UE5.6推送视频流”这个标题,第一反应是:“哦,用Media Player播放本地MP4?或者接个RTMP推流插件?”——我试过,也踩过坑…...

Open WebUI企业级部署指南:全功能AI平台架构与生产环境实践

Open WebUI企业级部署指南:全功能AI平台架构与生产环境实践 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui Open WebUI是一个功能强大的自托管A…...

Joy-Con Toolkit:一站式解决Switch手柄所有问题的智能管理工具

Joy-Con Toolkit:一站式解决Switch手柄所有问题的智能管理工具 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款专为Nintendo Switch手柄设计的开源管理工具,为游戏玩…...

渗透测试授权书:法律效力与技术执行的耦合设计

1. 这份授权书不是“走个形式”,而是渗透测试合法性的生死线很多人第一次接触渗透测试,看到《渗透测试授权书》模板,第一反应是:“不就是签个字的事?网上随便找个PDF填上名字就行。”我2015年刚入行时也这么想&#xf…...

通过taotoken cli一键配置python与nodejs开发环境

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过taotoken cli一键配置python与nodejs开发环境 在团队协作或个人多项目开发中,管理不同的大模型API密钥与端点配置是…...

ESP32音频录制系统:构建智能声音采集的完整解决方案

ESP32音频录制系统:构建智能声音采集的完整解决方案 【免费下载链接】esp32_SoundRecorder ESP32 Sound recorder with simple code in arduino-esp32. (I2S interface) 项目地址: https://gitcode.com/gh_mirrors/es/esp32_SoundRecorder 在物联网和嵌入式系…...

Axios内存泄漏:云原生Node.js服务的静默雪崩

1. 这不是漏洞公告,而是一次云原生环境下的“静默雪崩”你有没有遇到过这样的情况:服务在本地跑得好好的,一上Kubernetes就隔三差五OOM,Pod反复重启,监控里内存曲线像心电图一样剧烈波动,但代码里没写大对象…...

揭秘PlayAI语音中台三大核心壁垒:声学模型蒸馏技术、行业术语动态热更新引擎、信创环境全栈适配方案(附某央企POC压测原始数据)

更多请点击: https://kaifayun.com 第一章:PlayAI企业级语音解决方案全景概览 PlayAI 是面向中大型企业的端到端语音智能平台,深度融合ASR(自动语音识别)、TTS(文本转语音)、NLU(自…...

[MAF的Agent管道详解-06]ChatClientAgent对IChatClient和输入输出增强管道的整合

上面我们介绍了与LLM交互的IChatClient管道、持久化对话消息的ChatHistoryProvider、以及实现输入和输出增强的AIContextProvider,接下来我们来看看ChatClientAgent是如何将它们整合在一起的。 1. ChatClientAgent的构建 如下面的代码片段所示,ChatClien…...

150块淘来的Nvidia Grid K2,如何在ESXi 6.7上稳定分配vGPU?我的翻车与修复实录

150元Nvidia Grid K2显卡的ESXi 6.7虚拟化实战:从硬件检测到vGPU稳定分配全指南 在虚拟化环境中部署专业显卡一直是技术爱好者和小型实验室的热门话题。当预算有限时,二手市场上的老款专业显卡如Nvidia Grid K2就成为了极具吸引力的选择。这款发布于2013…...

终极HsMod炉石传说模改插件:如何用开源技术重塑你的游戏体验

终极HsMod炉石传说模改插件:如何用开源技术重塑你的游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 在炉石传说的世界里,每个玩家都渴望更流畅、更个性化的…...

Triton推理服务生产实践:模型部署的可观测性与弹性保障

1. 项目概述:当模型走出Jupyter,真正开始呼吸真实世界的空气“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句暗号,专为那些在Jupyter里调通了模型、画出了漂亮ROC曲线、却在部署时被现实迎…...

实测:把Ubuntu 22.04装进移动固态硬盘,读写速度到底怎么样?附性能优化技巧

移动固态硬盘上的Ubuntu 22.04性能实测与深度调优指南 当我们将完整的Ubuntu系统装进移动固态硬盘时,最令人忐忑的莫过于性能表现——这个装在口袋里的系统能否像内置硬盘一样流畅?本文将通过一系列严谨测试,揭示移动固态硬盘运行Ubuntu的真…...

甲言Jiayan:终极古汉语NLP解决方案,让文言文处理变得简单高效

甲言Jiayan:终极古汉语NLP解决方案,让文言文处理变得简单高效 【免费下载链接】Jiayan 甲言,专注于古代汉语(古汉语/古文/文言文/文言)处理的NLP工具包,支持文言词库构建、分词、词性标注、断句和标点。Jiayan, the 1st NLP toolk…...

3分钟学会:免费歌词制作工具让你轻松成为音乐剪辑高手 [特殊字符]

3分钟学会:免费歌词制作工具让你轻松成为音乐剪辑高手 🎵 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 你是否曾经想为自己喜欢的歌曲制作…...

体验Taotoken的模型广场如何辅助开发者快速选型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 体验Taotoken的模型广场如何辅助开发者快速选型 对于需要接入大模型能力的开发者而言,面对市场上众多的模型提供商和复…...

ATK-UART2ETH模块实战:5分钟搞定串口设备联网,告别老旧PLC的通讯烦恼

ATK-UART2ETH模块实战:5分钟搞定串口设备联网,告别老旧PLC的通讯烦恼 在工业自动化领域,老旧设备改造一直是个令人头疼的问题。想象一下这样的场景:车间里那台服役十年的西门子S7-200 PLC还在兢兢业业地工作,但它唯一…...

VideoDownloadHelper:免费视频下载插件终极使用指南

VideoDownloadHelper:免费视频下载插件终极使用指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否经常遇到想要保存网页视…...

【Java并发编程】Java虚拟线程与平台线程的区别、虚拟线程调度、适用/不适用场景、在Spring Boot中的集成(2026高频)(附《思维导图》+《面试高频考点清单》)

文章目录Java并发编程:虚拟线程系统性知识体系(2026高频)一、虚拟线程概述与发展历程1.1 核心定义1.2 发展里程碑1.3 核心价值二、虚拟线程与平台线程的核心区别2.1 本质差异对比表2.2 关键差异详细解释2.2.1 内存模型差异2.2.2 阻塞处理机制…...

构建企业内部知识问答Agent时如何借助Taotoken降低模型依赖风险

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 构建企业内部知识问答Agent时如何借助Taotoken降低模型依赖风险 应用场景类,企业在开发基于大模型的内部分析Agent时&a…...

5个高级技巧:掌握Dark Reader动态主题修复的最佳实践

5个高级技巧:掌握Dark Reader动态主题修复的最佳实践 【免费下载链接】darkreader Dark Reader Chrome and Firefox extension 项目地址: https://gitcode.com/gh_mirrors/da/darkreader Dark Reader是一款广受欢迎的浏览器扩展,它通过智能算法将…...

从官方例程到实际项目:AXI Timer v2.0在Zynq平台上的避坑指南与调试实录

从官方例程到实际项目:AXI Timer v2.0在Zynq平台上的避坑指南与调试实录 在嵌入式系统开发中,定时器是最基础也最关键的硬件外设之一。Xilinx提供的AXI Timer v2.0 IP核因其灵活的配置选项和丰富的功能特性,成为Zynq平台上实现精确时间控制的…...

3Dmigoto:如何让破败的立体游戏重获新生?

3Dmigoto:如何让破败的立体游戏重获新生? 【免费下载链接】3Dmigoto DX11 modding wrapper to enable fixing broken stereoscopic effects. Warning: 3Dmigoto[.]com is a phishing site, not us. 项目地址: https://gitcode.com/gh_mirrors/3d/3Dmig…...

在Node.js后端服务中集成Taotoken,调用多模型API完成内容生成

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Node.js后端服务中集成Taotoken,调用多模型API完成内容生成 将大模型能力集成到后端服务是现代应用开发的常见需求。…...

linux的常识及术语解释

1. 在Linux系统中,以 文件 方式访问设备 。 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。 3. Linux文件系统中每个文件用 i节点 来标识。 4. 全部磁盘块由四个部分组成,分别为引导块 、专用块 、 i节点表块 和数据存储块。…...

Display Driver Uninstaller完整攻略:显卡驱动清理的终极解决方案

Display Driver Uninstaller完整攻略:显卡驱动清理的终极解决方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-u…...

AI绘画如何听懂草图?文字+手绘混合生成原理与实战

1. 项目概述:当文字描述遇上手绘草图,AI绘画如何真正“听懂”你的想法? 你有没有过这样的经历:脑子里已经浮现出一幅画面——比如“一只戴圆框眼镜的柴犬坐在咖啡馆窗边,阳光斜射在它毛茸茸的耳朵上,背景是…...

学网安压根不卡学历,在校生自学这样走少绕好几年弯路

学网安压根不卡学历,在校生自学这样走少绕好几年弯路 前言 “网络安全只有计算机高材生才能学?” “没有名校背景,根本进不了这个行业?” “普通专科生、本科生、非科班出身想要自学网络安全,难度太大了吧&#xf…...

3步解锁Mac隐藏技能:Whisky让你的苹果电脑运行Windows应用

3步解锁Mac隐藏技能:Whisky让你的苹果电脑运行Windows应用 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 你是否曾经在Mac上收到一个.exe文件,却只能无奈地告…...