我之前在阿里巴巴技术部门担任团队面试官,多次负责淘宝双十一的订单系统维护,工作2年多从未出过bug,对于这个问题我还是比较有发言权的。
利益相关,拿几个订单系统的设计要点跟大家聊一聊。
防超卖问题
当商家将产品库存设置为有限数量时,买家下单产品就会减少相应的库存,其实现机制是:
读取库存表,判断库存,然后扣减库存
1.查询库存余量
SELECT available_stock FROM `seckill_activity`
WHERE commodity_id = 189 AND id = 28;
2.扣减库存
UPDATE `seckill_activity` SET available_stock = available_stock- 1
WHERE commodity_id = 189 AND id = 28 AND available_stock > 0;
然而当大流量并发请求数据库时,就有可能导致系统崩溃,导致超卖。超卖即“超卖缺货”,当宝贝库存接近0时,如果多个买家同时付款购买此宝贝,就会出现“超卖缺货”现象。
这种情况一般会出现在大型秒杀活动上,每个秒杀的用户都去数据库查询库存校验库存,然后扣减库存,导致数据库崩溃。
**应对措施是将库存信息加载到Redis中,将MySQL的访问压力转移到Redis上,直接通过 Redis 来判断并扣减库存。**订单系统常用的数据库是MySQL,但在秒杀环境下会将库存信息加载到Redis中,将MySQL的访问压力转移到Redis上&#