2021:高并发第一战——秒杀、缓存与消息队列
2021:高并发第一战——秒杀、缓存与消息队列
这一年发生了什么
2021 年是我工作的第二年,所在的社区类平台开始承接大型营销活动。第一次直面「高并发」三个字——活动开抢瞬间,接口被打爆,库存超卖,被业务方追着问。
这一年我主导了高并发活动场景的技术方案设计。
技术上的变化
1. Redis + Lua 预减库存
超卖的本质是「检查和扣减不是原子的」。方案演进至今记忆犹新:
- ❌ 数据库行锁
UPDATE stock SET n = n - 1 WHERE n > 0:扛不住开抢瞬间的流量; - ❌ 先查 Redis 再扣:并发下依然超卖;
- ✅ Lua 脚本原子预减:判断 + 扣减在一个脚本里完成,超卖归零。
2. 缓存三大问题的实战
缓存击穿(热点 Key 过期瞬间打穿 DB)用 DCL(双重检查锁)+ 热点 Key 打散解决。雪崩、穿透这些面试背了无数遍的名词,这一年全部在生产环境遇到了。
3. RocketMQ 事务消息
下单要同时扣库存、写订单、发通知,跨服务如何一致?事务消息 + 最终一致性,配合幂等键(userId + activityId + date)解决重复消费。这是我第一次真正理解「分布式事务不是二选一,而是选代价最小的那个」。
4. Feed 流与搜索
- Feed 流采用写扩散 + 读扩散混合模型,Redis Sorted Set 排序,接口平均耗时从 200ms 降到 40ms;
- 基于 ElasticSearch 搭建全文检索,第一次接触倒排索引。
个人感悟
高并发的答案不在框架里,而在「把流量挡在它该被挡住的那一层」。
这一年把 Redis 和 MySQL 的书翻烂了:InnoDB 的 MVCC、覆盖索引、事务隔离级别,不再是面试八股,而是排查问题时的地图。
另一个感悟:性能优化一定要先有度量。没有监控数据,「优化」只是玄学——这个念头在两年后落地成了完整的可观测性体系。