在 CentOS 上部署的 Redis 本身不是一个专门的限流系统,但可以利用 Redis 的高性能和原子操作来实现接口/请求限流。下面按常见做法 + 示例说明。
思路:
每 N 秒最多允许 M 次请求。
Redis 实现(SET + EXPIRE)
# 计数器 key
INCR rate_limit:user:123
EXPIRE rate_limit:user:123 60
应用逻辑:
INCR = 1,设置 60 秒过期INCR> 100 → 拒绝✅ 优点:简单
❌ 缺点:临界问题(59s + 1s 可能翻倍)
思路:
使用 ZSET 记录请求时间戳。
# 添加请求
ZADD rate_limit:user:123 NOW MSCORE
# 删除窗口外数据(如 60 秒)
ZREMRANGEBYSCORE rate_limit:user:123 0 (NOW-60000)
# 统计当前数量
ZCARD rate_limit:user:123
应用逻辑:
ZCARD > 100 → 限流✅ 精确
❌ 稍微复杂
思路:
Lua 脚本示例(核心逻辑)
local tokens = redis.call('get', KEYS[1])
if not tokens then
tokens = ARGV[1]
end
if tonumber(tokens) > 0 then
redis.call('decr', KEYS[1])
return 1
else
return 0
end
通常配合:
EXPIRE如果你用的是:
推荐:
Redis + LuaRedis + SentinelRedis + Ratelimiter例如 Java:
RedissonClient client;
RRateLimiter limiter = client.getRateLimiter("api");
limiter.trySetRate(RateType.OVERALL, 100, 1, RateIntervalUnit.MINUTES);
yum install epel-release -y
yum install redis -y
systemctl enable redis
systemctl start redis
redis-cli
SET test:count 0 EX 60
INCR test:count
✅ 使用 Lua 脚本保证原子性
✅ 避免大 key(滑动窗口定期清理)
✅ 限流 key 设计清晰:
limit:{service}:{ip/user/id}
我可以给你:
告诉我你的使用场景即可。