速率限制是保障系统稳定性的重要手段,Redis凭借其高性能与灵活的数据结构,常被用于实现这一功能。以下是关键要点:

1. 核心原理

  • 基于计数器:通过INCR命令统计请求次数,结合EXPIRE设置过期时间
    Redis_计数器原理
  • 滑动窗口算法:更精确的统计方式,可参考 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或应用层拦截规则
  • 监控与调优(使用RedissonRedis-cli工具)

3. 代码模板

  • Lua脚本示例
    Redis_代码模板
  • 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