温馨提示×

centos redis如何限流

小樊
44
2026-09-27 01:09:51
栏目: 云计算

在 CentOS 上部署的 Redis 本身不是一个专门的限流系统,但可以利用 Redis 的高性能和原子操作来实现接口/请求限流。下面按常见做法 + 示例说明。


一、常见 Redis 限流方案

1️⃣ 固定窗口限流(最简单)

思路:
每 N 秒最多允许 M 次请求。

Redis 实现(SET + EXPIRE)

# 计数器 key
INCR rate_limit:user:123
EXPIRE rate_limit:user:123 60

应用逻辑:

  • 第一次请求:INCR = 1,设置 60 秒过期
  • 后续请求:INCR
  • 若 > 100 → 拒绝

✅ 优点:简单
❌ 缺点:临界问题(59s + 1s 可能翻倍)


2️⃣ 滑动窗口限流(推荐)

思路:
使用 ZSET 记录请求时间戳。

# 添加请求
ZADD rate_limit:user:123 NOW MSCORE

# 删除窗口外数据(如 60 秒)
ZREMRANGEBYSCORE rate_limit:user:123 0 (NOW-60000)

# 统计当前数量
ZCARD rate_limit:user:123

应用逻辑:

  • ZCARD > 100 → 限流

✅ 精确
❌ 稍微复杂


3️⃣ 令牌桶(生产级)

思路:

  • 桶中有 token
  • 定时补充
  • 请求消耗 token

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
  • 后台线程补充 token

4️⃣ Redis + 限流中间件(最省事)

如果你用的是:

  • Nginx
  • Spring Boot
  • Gateway

推荐:

  • Redis + Lua
  • Redis + Sentinel
  • Redis + Ratelimiter

例如 Java:

RedissonClient client;
RRateLimiter limiter = client.getRateLimiter("api");
limiter.trySetRate(RateType.OVERALL, 100, 1, RateIntervalUnit.MINUTES);

二、CentOS 上的实际操作示例

1️⃣ 安装 Redis(如未安装)

yum install epel-release -y
yum install redis -y
systemctl enable redis
systemctl start redis

2️⃣ 测试限流脚本

redis-cli
SET test:count 0 EX 60
INCR test:count

三、生产建议

✅ 使用 Lua 脚本保证原子性
✅ 避免大 key(滑动窗口定期清理)
✅ 限流 key 设计清晰:

limit:{service}:{ip/user/id}

四、你想用在哪?

我可以给你:

  • ✅ Nginx + Redis 限流配置
  • ✅ Spring Boot Redis 限流代码
  • ✅ Shell / Python 脚本示例
  • ✅ 高并发生产级方案

告诉我你的使用场景即可。

0 踩