速率限制是保障系统稳定性的重要手段,Redis凭借其高性能与灵活的数据结构,常被用于实现这一功能。以下是关键要点:
1. 核心原理
- 基于计数器:通过
INCR
命令统计请求次数,结合EXPIRE
设置过期时间 - 滑动窗口算法:更精确的统计方式,可参考 Redis 滑动窗口实现 深入了解
- 令牌桶模型:适合突发流量场景,需注意桶容量与填充速率的配置
2. 实现步骤
- 安装Redis服务
- 选择合适的数据结构(如Hash或String)
- 编写Lua脚本保证原子性操作
-- 示例 Lua 脚本 local key = KEYS[1] local ip = ARGV[1] local max_requests = tonumber(ARGV[2]) local window_size = tonumber(ARGV[3]) -- 逻辑实现...
- 配置Nginx或应用层拦截规则
- 监控与调优(使用
Redisson
或Redis-cli
工具)
3. 代码模板
- Lua脚本示例
- Node.js调用示例
const redis = require('redis'); const client = redis.createClient(); async function rateLimit(key, max, window) { // 实现逻辑... }
4. 注意事项
- 避免频繁的
KEYS
扫描操作 - 合理设置过期时间(建议
window_size
的5-10倍) - 可结合
Redisson
实现分布式锁 - 更多关于 Redis 的使用,请访问 /docs/redis_tutorial