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:如何处理用户退款?

提示

  • 用户购买后可能退款
  • 退款需要回补库存
  • 如何保证原子性?