在 CentOS 上,Redis 本身没有像 Nginx 那样直接的“限流”配置,但可以通过 Redis 功能 + 客户端逻辑 来实现限流。下面按常见场景给你说明。
# 安装依赖
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/
编辑 redis.conf:
loadmodule /usr/lib/libredis_cell.so
重启 Redis:
systemctl restart redis
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 限流方式
INCR user:123:count
EXPIRE user:123:count 60
逻辑(客户端):
❌ 缺点:不是原子操作,高并发不安全
✅ 改进(Lua 脚本):
local current
current = redis.call("incr", KEYS[1])
if current == 1 then
redis.call("expire", KEYS[1], ARGV[1])
end
return current
ZADD user:123 NOW MSCORE
ZREMRANGEBYSCORE user:123 0 (NOW-60000)
ZCARD user:123
逻辑:
✅ 精确、无模块依赖
❌ 写操作稍多
常见组合:
示例(伪代码):
allowed := redis.eval(luaScript, key, limit, window)
if !allowed {
return "too many requests"
}
setenforce 0
| 场景 | 推荐方案 |
|---|---|
| 精准限流 | Redis-Cell |
| 无模块 | ZSET 滑动窗口 |
| 简单接口 | INCR + Lua |
| 高并发 | Lua 脚本 |
如果你告诉我:
我可以直接给你可复制的配置 + 脚本。