限流算法 redis:高并发场景下的核心技术解析
在实际开发中,限流算法是应对高并发流量的关键防线。今天咱们重点聊聊如何用Redis这把瑞士军刀实现高效限流,这也是大厂面试的常考点。
🔥 为什么需要限流算法?
想象双十一秒杀场景:瞬间百万请求涌来。不加控制的话:
- 数据库连接池被打爆
- CPU负载飙升
- 服务雪崩连环宕机
Redis凭借单线程+内存操作特性,天然适合做限流控制中枢。
🛠️ Redis实现四大经典限流算法
📌 固定窗口计数器
-- Redis原子操作实现
local key = "rate_limit:" .. KEYS[1]
local limit = tonumber(ARGV[1])
local current = redis.call('GET', key) or 0
if current + 1 > limit then
return 0
else
redis.call('INCR', key)
redis.call('EXPIRE', key, ARGV[2])
return 1
end
✅ 优点:实现简单,内存占用少
⚠️ 缺点:窗口临界突发流量可能穿透
📌 滑动日志算法
用Redis的ZSET保存请求时间戳:
# 伪代码实现
timestamps = zrange(key, 0, -1)
now = time.time()
# 删除60秒外记录
zremrangebyscore(key, 0, now-60)
if zcard(key) < limit:
zadd(key, now, str(uuid4()))
return "通过"
🔍 精准控制但内存消耗较大
📌 令牌桶算法(生产环境首选)

-- Redis实现核心逻辑
local tokens = redis.call('HGET', key, 'tokens')
local last_time = redis.call('HGET', key, 'time')
local new_tokens = (now - last_time) * rate -- 补充令牌
if new_tokens > 0 then
tokens = math.min(max_tokens, tokens + new_tokens)
end
if tokens >= 1 then
redis.call('HSET', key, 'tokens', tokens-1)
return true
end
🌟 兼顾突发流量与平均速率控制
📌 漏桶算法
类似消息队列的消费模式:
- 请求进入桶队列
- 以恒定速率处理
- 队列满则拒绝请求
Redis可用LIST结构实现,适合流量整形场景。
⚡ 算法选择实战建议
| 算法类型 | 适用场景 | Redis实现复杂度 | |----------------|-------------------------|----------------| | 固定窗口 | 简单低频控制 | ⭐ | | 滑动窗口 | 精准控流 | ⭐⭐⭐⭐ | | 令牌桶 | 突发流量兼容型(推荐) | ⭐⭐⭐ | | 漏桶 | 恒定速率输出 | ⭐⭐ |
💡 面试避坑指南
当面试官问“如何用Redis做分布式限流”时:
- 明确业务场景(突发/平滑流量?)
- 对比算法优缺点
- 强调Redis的原子操作(INCR/LUA脚本)
- 提及集群环境下的一致性哈希问题
📌 2025年Java面试宝典最新版:
🔗 百度网盘下载
提取码:9b3g
🎁 特别福利
如果大家需要购买面试鸭会员,可以通过面试鸭返利网找我,额外返利25元!用专业工具备战面试更高效:

掌握好Redis限流算法,不仅能扛住高并发冲击,更是面试突围的利器。建议动手实践这些方案,遇到真实场景才能游刃有余。


