在 CentOS 上通过 Redis 实现“限流”,常见有 3 种层次:
下面按使用频率从高到低讲。
INCR + EXPIRE(固定窗口限流)示例:限制某 IP 每秒最多 10 次
key = limit:ip:192.168.1.100
INCR key
EXPIRE key 1
逻辑(伪代码):
count = INCR key
if count == 1:
EXPIRE key 1
if count > 10:
拒绝请求
✅ 优点:简单
❌ 缺点:边界突发(如 0.99s + 1.01s)
Lua + INCR(原子限流,生产推荐 ✅)-- limit.lua
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local expire = tonumber(ARGV[2])
local count = redis.call('incr', key)
if count == 1 then
redis.call('expire', key, expire)
end
if count > limit then
return 0
else
return 1
end
调用:
redis-cli --eval limit.lua limit:ip:1.1.1.1 , 10 1
List(滑动窗口,精确限流)LPUSH limit:ip:1.1.1.1 now_ts
LTRIM limit:ip:1.1.1.1 0 9
LLEN limit:ip:1.1.1.1
适合:
常用:
Redisson 示例:
RRateLimiter limiter = redisson.getRateLimiter("api");
limiter.trySetRate(RateType.OVERALL, 100, 1, RateIntervalUnit.SECONDS);
limiter.tryAcquire();
/etc/redis.conf
maxclients 10000
maxmemory 2gb
maxmemory-policy allkeys-lru
timeout 300
rename-command FLUSHALL ""
rename-command KEYS ""
Redis 7 支持:
user app on >password ~limit:* +@read +@write
配合:
# 修改配置后
systemctl restart redis
systemctl status redis
| 场景 | 推荐 |
|---|---|
| API 接口限流 | Lua + INCR |
| 分布式系统 | Redisson |
| 简单防护 | maxclients + timeout |
| 高并发 | 令牌桶 |
如果你愿意,可以告诉我:
我可以给你 完整可直接用的配置或代码。