滑动时间窗口、令牌桶算法、漏桶算法:程序员必懂的限流三剑客
📥 2025年Java面试高频宝典:
🔗 百度网盘链接
🔐 提取码:9b3g
(限流策略常考!速存防失效)
🔍 什么是滑动时间窗口算法?
咱们程序员面试被问限流,滑动时间窗口绝对是高频考点!它的核心思想是动态统计最近N秒内的请求量。举个栗子🌰:面试官问“如何实现1分钟内最多100次调用?”
这时候滑动时间窗口就派上用场了:
- 维护一个时间线队列,记录每次请求的时间戳
- 新请求到来时,剔除超过1分钟的老数据
- 检查当前队列长度是否<100
- 若未超限则加入队列,否则拒绝

▲ 滑动窗口动态移动边界,实时性优于固定窗口
实际场景:
- API网关限流(如Nginx限流模块)
- 分布式场景需用Redis + Lua保证原子性
- 注意时间精度影响内存消耗(毫秒级需更多存储)
🪙 令牌桶算法:应对突发流量的神器
当面试官追问“如何允许突发流量?”时,令牌桶算法就是标准答案!它的运作像极了游乐园🎢:
- 有个桶以恒定速率生成令牌(如10个/秒)
- 请求到来时消耗1个令牌
- 桶满时丢弃多余令牌
- 突发流量可消耗积攒的令牌
[令牌桶]
│ ▲
│ │ 固定速率注入
│ ▼
┌──┴──┐
│ █ │ → 消耗令牌 → 请求通过
└─────┘
▲ 令牌不足时直接拒绝请求
核心优势:
✅ 允许短时间内突发流量(如抢购场景)
✅ 平滑过渡到平均速率
✅ Guava RateLimiter就是经典实现
🪣 漏桶算法:最严格的流量整形
漏桶算法像是个带孔的水桶🪣,强调绝对平滑的输出:
- 请求进入桶队列(桶有容量上限)
- 以固定速率从桶底漏出请求处理
- 桶满时新请求被丢弃

▲ 无论输入多波动,输出始终保持恒定
vs 令牌桶关键区别:
| 特性 | 漏桶算法 | 令牌桶算法 |
|--------------|----------------|------------------|
| 流量控制方向 | 控制输出速率 | 控制输入速率 |
| 突发处理 | 严格禁止 | 允许消耗存量 |
| 典型应用 | 流量整形 | 突发流量管控 |
💡 面试实战技巧
当被要求“对比三种算法”时,可以这样组织答案:
- 滑动时间窗口:实时统计简单,但精度受窗口划分影响
- 令牌桶:适合需要容忍突发的场景(如API限流)
- 漏桶:强保证输出速率(如视频流转码)
🌐 该用哪个?场景决定
- 监控告警系统 → 滑动时间窗口(快速统计)
- 开放平台API → 令牌桶算法(允许合理突发)
- 支付系统下游调用 → 漏桶算法(保护脆弱系统)
💻 技术人都在用的提效工具:
更多架构设计真题 → 访问 面试鸭返利网



