存储后端
📚 目录
内存存储(默认)
快速、简单、仅限单服务器。
特点:
- ✅ 最快的速度
- ✅ 无外部依赖
- ✅ 零配置
- ❌ 仅限单服务器
- ❌ 服务器重启丢失数据
适用场景:
- 单机应用
- 开发和测试
- 小型服务
Redis 存储
分布式、持久化、多服务器支持。
方式 1: 连接字符串(推荐)
特点:
- ✅ 最简洁
- ✅ 自动创建连接
- ✅ 开箱即用
- ⚠️ 短生命周期脚本或测试结束前应调用
await limiter.close()关闭库创建的 Redis client
方式 2: 使用 ioredis 客户端
特点:
- ✅ 完全控制连接
- ✅ 支持连接池
- ✅ 支持高级配置
- ✅ 外部传入 client 默认由调用方管理;如需
RedisStore.close()关闭它,可设置ownsClient: true
方式 3: Redis 集群
方式 4: Redis Sentinel
特点:
- ✅ 高可用
- ✅ 自动故障转移
- ✅ 适合生产环境
CacheHubStore 原子后端
CacheHubStore 使用 cache-hub@2.2.4 的原子状态原语。它适合希望保留 flex-rate-limit 算法层,同时复用 cache-hub Redis Lua 原子后端的场景。
特点:
- ✅ fixed-window、sliding-window、token-bucket、leaky-bucket 均走 cache-hub 原子状态原语
- ✅ Redis 路径由 cache-hub Lua 脚本保证高并发读改写安全
- ✅ 不传
client时可使用 cache-hub 内存原子后端,过期限流状态会自动清理 - ✅ 保留 flex-rate-limit 的算法、middleware、响应头与框架集成
- ✅ 可通过
await limiter.close()关闭内部清理定时器或 cache 资源
自定义存储
实现自己的存储后端。
实现步骤:
- 创建一个类实现存储接口
- 实现
increment()方法 - (可选)实现
decrement()和reset()方法 - 传递给 RateLimiter
存储对比
选择指南
选择内存存储
选择 Redis
选择自定义存储
性能对比
性能参考维度
以下数值是理论/经验级参考,实际 QPS 和延迟会受到 Node.js 版本、CPU、网络、Redis 部署形态、算法、key 分布和业务处理耗时影响。发布正式性能结论前,请使用项目 benchmark 脚本或生产压测数据替换为可复现结果。
内存占用说明(10,000个用户):
- Memory:
- 固定窗口:78 KB(每个key 8字节)
- 滑动窗口:7.8 MB(每个key 800字节)
- Redis: ~50 KB(序列化后的数据)
QPS说明:
- Memory: 本地内存访问,通常是最高吞吐路径
- Redis: 受网络往返、pipeline/Lua 策略和 Redis CPU 影响
- Redis 集群: 受 key 分布、slot 路由和热点 key 影响
选择建议
选择决策树
具体场景选择
场景1:个人项目 / 小型应用
场景2:中小型企业应用
场景3:大型分布式系统
场景4:开发和测试环境
传统选择建议(简化版)
选择内存存储
Redis 性能优化
📚 相关文档
相关配置:
性能优化:
- 📖 算法深度分析 - 性能对比数据和优化建议
基础知识:
- 📖 快速开始 - 基本用法
返回:
- 📖 文档中心 - 查看所有文档和学习路径