一图速记:
| 算法/结构 | 类型 | 主要作用 | 应用场景示例 |
|---|
| 令牌桶算法 | 限流算法 | 控制请求速率 | 接口限流,突发请求处理 |
| 漏桶算法 | 限流算法 | 控制流出速率 | 接口平滑输出,缓解突发压力 |
| 布隆过滤器 | 数据结构 | 判断元素是否存在 | 缓存穿透防护、黑名单检查 |
1. 令牌桶算法(Token Bucket)
原理:
- 系统以固定速率往桶中放令牌;
- 每个请求要消费一个令牌;
- 没有令牌就拒绝/排队;
- 支持突发请求(桶有余量时)。
特点:
- 平均速率控制;
- 可处理突发流量(桶内有余量);
- 更灵活。
应用场景:
- 接口限流(高并发情况下也允许一定突发);
- API网关、网速控制等。
2. 漏桶算法(Leaky Bucket)
原理:
- 请求先进入桶中;
- 桶以固定速率漏水(处理请求);
- 桶满时,多余请求被丢弃/排队;
- 不支持突发请求(超过容量就丢弃)。
特点:
- 输出速率恒定;
- 平滑处理请求;
- 避免系统被突发请求打垮。
应用场景:
3. 布隆过滤器(Bloom Filter)
原理:
- 一种空间效率极高的概率型数据结构;
- 使用多个哈希函数,将元素映射到位数组;
判断某元素是否存在时:
- 若对应位全为1:可能存在(但有误判);
- 有任何一位为0:一定不存在。
特点:
- 极高效率和节省内存;
- 有一定误判率(可调),但不会漏判;
- 不能删除元素(除非用Counting Bloom Filter)。
应用场景:
- 防止缓存穿透(如Redis前);
- 黑名单过滤;
- 数据去重。
总结对比
| 特性 | 令牌桶 | 漏桶 | 布隆过滤器 |
|---|
| 类型 | 限流算法 | 限流算法 | 概率型数据结构 |
| 控制速率方式 | 控制放行速率(加令牌) | 控制处理速率(出水) | 判断数据是否存在 |
| 是否支持突发 | ✅ 是 | ❌ 否 | 不适用 |
| 是否有误判 | ❌ 无 | ❌ 无 | ✅ 有(可能误判存在) |
| 使用场景 | 限流、防攻击 | 平滑处理请求 | 缓存穿透、黑名单过滤 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。