温馨提示×

centos redis配置怎样限流

小樊
47
2026-10-11 17:48:08
栏目: 云计算

在 CentOS 上通过 Redis 实现“限流”,常见有 3 种层次:

  1. Redis 自身保护(防止被打爆)
  2. 应用层用 Redis 做限流(最常用)
  3. Redis 7 的 Client Side Caching / ACL 限速(高级)

下面按使用频率从高到低讲。


一、应用层用 Redis 做限流(推荐 ✅)

1️⃣ 基于 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)


2️⃣ 基于 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

3️⃣ 基于 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

适合:

  • 接口级限流
  • QPS 控制

4️⃣ 基于 Redis + Token Bucket(最专业)

常用:

  • Redis + Lua 实现令牌桶
  • 或使用 Redisson(Java)

Redisson 示例:

RRateLimiter limiter = redisson.getRateLimiter("api");
limiter.trySetRate(RateType.OVERALL, 100, 1, RateIntervalUnit.SECONDS);
limiter.tryAcquire();

二、Redis 自身“防被打爆”配置(CentOS)

1️⃣ 限制最大连接数

/etc/redis.conf

maxclients 10000

2️⃣ 限制内存(防止 OOM)

maxmemory 2gb
maxmemory-policy allkeys-lru

3️⃣ 超时空闲连接

timeout 300

4️⃣ 禁止危险命令(防滥用)

rename-command FLUSHALL ""
rename-command KEYS ""

三、Redis 7 ACL 限速(高级)

Redis 7 支持:

user app on >password ~limit:* +@read +@write

配合:

  • 不同业务不同 key 前缀
  • 不同用户不同限流规则

四、CentOS 启动 & 重载

# 修改配置后
systemctl restart redis
systemctl status redis

五、推荐方案总结

场景 推荐
API 接口限流 Lua + INCR
分布式系统 Redisson
简单防护 maxclients + timeout
高并发 令牌桶

如果你愿意,可以告诉我:

  • ✅ 用 Java / Python / Go / Nginx?
  • ✅ 限 IP / 用户 / 接口?
  • ✅ QPS 多少?

我可以给你 完整可直接用的配置或代码。

0 踩