这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
Redis预扣:使用Redis原子操作预扣库存
问题:数据库扛不住了,怎么办?🆘
上一章我们发现:
数据库锁方案性能:
- 悲观锁:1,000-5,000 QPS
- 乐观锁:5,000-20,000 QPS
秒杀需求:
- QPS:500,000+
- 差距:25-500倍!核心问题:数据库是磁盘存储,I/O速度慢,无法支撑高并发。
解决思路:用内存数据库Redis替代MySQL!
Redis为什么这么快?⚡
Redis原子操作:库存扣减的核心 🎯
方案1:使用DECR命令
输出结果:
✅ 初始化商品1库存:10
测试扣减:
第 1次扣减:✅ 成功,剩余库存:9
第 2次扣减:✅ 成功,剩余库存:8
第 3次扣减:✅ 成功,剩余库存:7
...
第10次扣减:✅ 成功,剩余库存:0
第11次扣减:❌ 失败,剩余库存:0
第12次扣减:❌ 失败,剩余库存:0
...方案2:使用Lua脚本(推荐)⭐
并发测试:验证原子性 🧪
测试结果:
============================================================
并发测试:10000个用户抢购100件商品
============================================================
📊 测试结果:
总请求数:10000
成功数:100
失败数:9900
总耗时:1523.45ms
平均响应时间:0.15ms
QPS:6564
最终库存:0
扣减数量:100
原子性验证:✅ 通过方案对比:DECR vs Lua脚本 ⚖️
性能测试:Redis vs MySQL ⚡
完整示例:Redis库存扣减系统 🎯
想一想
问题 1:Redis扣减后,数据库库存怎么办?
提示:
- Redis只扣了内存中的库存
- 数据库的库存还没扣
- 如何保证Redis和数据库一致?
问题 2:Redis崩溃了怎么办?
提示:
- Redis数据在内存中
- 如果Redis宕机,库存数据会丢失
- 如何保证数据安全?
问题 3:如何处理用户退款?
提示:
- 用户购买后可能退款
- 退款需要回补库存
- 如何保证原子性?