温馨提示×

centos redis配置怎么限流

小樊
51
2026-09-11 18:48:06
栏目: 云计算

CentOS 上,Redis 本身没有像 Nginx 那样直接的“限流”配置,但可以通过 Redis 功能 + 客户端逻辑 来实现限流。下面按常见场景给你说明。


一、Redis 官方原生方案(推荐):Redis-Cell 模块(漏斗限流)

1. 安装 Redis-Cell(CentOS)

# 安装依赖
yum install -y git make gcc

# 下载
git clone https://github.com/brandur/redis-cell.git
cd redis-cell

# 编译
make

# 复制模块
cp libredis_cell.so /usr/lib/

2. 配置 Redis 加载模块

编辑 redis.conf

loadmodule /usr/lib/libredis_cell.so

重启 Redis:

systemctl restart redis

3. 使用 CL.THROTTLE 限流

CL.THROTTLE user:123 100 400 60 1

含义:

  • user:123:限流对象
  • 100:桶容量
  • 400:60 秒内允许 400 次
  • 60:时间窗口(秒)
  • 1:本次消耗 1 个额度

返回示例:

1) (integer) 0   # 0=允许,1=拒绝
2) (integer) 99  # 剩余额度
3) (integer) 1   # 重置时间

最专业、最精准的 Redis 限流方式


二、不使用模块的限流方案(常用)

方案 1:INCR + EXPIRE(简单计数限流)

INCR user:123:count
EXPIRE user:123:count 60

逻辑(客户端):

  • 超过 100 → 限流
  • 60 秒自动清零

❌ 缺点:不是原子操作,高并发不安全

✅ 改进(Lua 脚本):

local current
current = redis.call("incr", KEYS[1])
if current == 1 then
  redis.call("expire", KEYS[1], ARGV[1])
end
return current

方案 2:ZSET 滑动窗口限流(推荐)

ZADD user:123 NOW MSCORE
ZREMRANGEBYSCORE user:123 0 (NOW-60000)
ZCARD user:123

逻辑:

  • 60 秒内请求数 > 100 → 拒绝

✅ 精确、无模块依赖
❌ 写操作稍多


三、应用层限流(结合 Redis)

常见组合:

  • Java:Spring + Redis + Lua
  • PHP:Redis + Redis::eval()
  • Go:go-redis + Lua

示例(伪代码):

allowed := redis.eval(luaScript, key, limit, window)
if !allowed {
    return "too many requests"
}

四、CentOS 常见坑提醒

  • Redis 版本 ≥ 4 才支持 module
  • SELinux 可能阻止模块加载
setenforce 0
  • 防火墙不影响 Redis 限流

五、总结建议

场景 推荐方案
精准限流 Redis-Cell
无模块 ZSET 滑动窗口
简单接口 INCR + Lua
高并发 Lua 脚本

如果你告诉我:

  • CentOS 版本
  • Redis 版本
  • 限流对象(IP / 用户 / 接口)

我可以直接给你可复制的配置 + 脚本

0