实战案例

通过秒杀系统、高并发计数器和限流算法三个经典案例,综合运用并发编程技术。

秒杀系统设计 ⭐⭐⭐⭐⭐

核心挑战

秒杀场景特点

  • 瞬时高并发(10 万+ QPS)

  • 库存有限(100 件商品)

  • 超卖风险(并发扣减库存)

  • 恶意请求(刷单、爬虫)

架构设计

客户端

CDN/Nginx(静态资源)

网关层(限流、鉴权)

业务层(秒杀服务)

缓存层(Redis)

数据库层(MySQL)

方案对比

方案
优点
缺点
适用场景

数据库行锁

简单

性能差,易死锁

低并发

Redis 缓存库存

性能高

可能超卖

高并发

Redis 锁

可靠性高

性能一般

中等并发

消息队列削峰

削峰填谷

延迟高

超高并发

方案 1:Redis 原子扣减

实现

优点

  • 性能高(Redis 内存操作)

  • 原子性(Lua 脚本)

  • 防止重复下单

缺点

  • Redis 宕机风险

  • 需要数据同步

方案 2:分布式锁 + 预扣库存

实现

方案 3:消息队列削峰

实现

优点

  • 削峰填谷

  • 异步解耦

  • 提高吞吐量

缺点

  • 延迟高

  • 消息丢失风险

优化点总结

1. 前端优化

  • 按钮置灰(防止重复提交)

  • 验证码(防止机器刷单)

  • 页面静态化(CDN 加速)

2. 网关层优化

  • IP 限流(每秒 10 次)

  • 用户限流(每秒 1 次)

  • 恶意请求过滤

3. 缓存层优化

  • Redis 预热(提前加载库存)

  • 本地缓存(减少 Redis 访问)

  • 读写分离(主写从读)

4. 数据库层优化

  • 主从复制

  • 分库分表

  • 异步落库


高并发计数器 ⭐⭐⭐⭐⭐

场景分析

典型场景

  • 接口 QPS 统计

  • 视频播放次数

  • 文章阅读量

  • 点赞数

要求

  • 高并发写入(10 万+ TPS)

  • 实时读取

  • 数据不丢失

方案对比

方案
性能
准确性
实现复杂度

AtomicLong

LongAdder

Redis INCR

异步批量更新

极高

最终一致

方案 1:LongAdder(单机)

实现

优点

  • 性能极高(分段累加)

  • 实现简单

缺点

  • 单机统计

  • 需要定时上报

方案 2:Redis + 本地缓存

实现

优点

  • 分布式统计

  • 减少 Redis 访问

  • 性能高

缺点

  • 实现复杂

  • 最终一致性

方案 3:时间窗口计数器

实现(滑动窗口):


限流算法 ⭐⭐⭐⭐⭐

限流算法对比

算法
优点
缺点
适用场景

固定窗口

简单

临界突刺

粗粒度限流

滑动窗口

平滑

内存占用

精确限流

漏桶

匀速处理

无法应对突发

消息队列

令牌桶

应对突发

实现复杂

API 网关

算法 1:固定窗口

实现

问题:临界突刺

算法 2:滑动窗口

实现

算法 3:令牌桶(Guava RateLimiter)

实现

算法 4:漏桶(队列实现)

实现

分布式限流(Redis + Lua)

实现(令牌桶):


面试要点 ⭐⭐⭐⭐⭐

Q1: 秒杀系统如何防止超卖?

  • Redis Lua 脚本原子扣减库存

  • 分布式锁

  • 数据库乐观锁(version 字段)

Q2: 秒杀系统如何提高性能?

  • 前端:按钮置灰、验证码

  • 网关:IP 限流、用户限流

  • 缓存:Redis 预热、本地缓存

  • 异步:消息队列、异步落库

Q3: 高并发计数器如何设计?

  • 单机:LongAdder(分段累加)

  • 分布式:Redis + 本地缓存 + 定时上报

  • 时间窗口:按分钟统计,滑动窗口查询

Q4: 限流算法有哪些?

  • 固定窗口:简单,有临界突刺问题

  • 滑动窗口:平滑,内存占用高

  • 漏桶:匀速处理,无法应对突发

  • 令牌桶:应对突发,实现复杂

Q5: 固定窗口和滑动窗口的区别?

  • 固定窗口:按整秒统计,临界时刻可能超限

  • 滑动窗口:按任意时间段统计,更精确

Q6: 令牌桶和漏桶的区别?

  • 令牌桶:允许突发流量(积累令牌)

  • 漏桶:匀速处理,削峰填谷

Q7: 如何实现分布式限流?

  • Redis + Lua 脚本

  • 滑动窗口(Sorted Set)

  • 令牌桶(Hash 存储令牌数和时间戳)

Q8: 秒杀系统如何防止恶意请求?

  • 验证码(防止机器刷单)

  • IP 限流(每秒 10 次)

  • 用户限流(每秒 1 次)

  • Token 机制(一次性令牌)


参考资料

  1. 书籍推荐:《亿级流量网站架构核心技术》、《高并发系统设计 40 问》

  2. 开源项目

    • Sentinel:阿里巴巴流控组件

    • Guava RateLimiter:Google 限流工具

  3. 限流算法论文:《Token Bucket Algorithm》

Last updated