秒杀系统如何保证数据库不崩溃以及防止商品超卖
1、应用场景
电商商城,商家上架了一个秒杀活动,早上10点开始,商品A参与秒杀,一共有20个库存,预计10W的人去抢。
2、面临问题
高并发、库存不可超卖
3、问题解决
1)高并发,我们不能把所有的请求都去数据库查商品详情,查商品库存,这样数据库会顶不住,很容易的我们就想到了用Redis解决;
2)库存超卖问题,这个问题主要是由于用户在同时读取到的库存均为大于0,从而认为我们该商品还没被秒完,继续创建了订单,导致了商品超卖了。
4、编码实现
1、数据库新建两张表
秒杀订单
CREATE TABLE `ms_order` ( `ms_order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT "订单ID", `created_time` datetime DEFAULT NULL COMMENT "创建时间", `order_price` decimal(12,2) DEFAULT NULL COMMENT "订单总价", `state` tinyint(1) DEFAULT "1" COMMENT "订单状态 1未支付 2已支付 3已发货 4已收货 -1已取消", `pay_time` datetime DEFAULT NULL COMMENT "支付时间", `fh_time` datetime DEFAULT NULL COMMENT "发货时间", PRIMARY KEY (`ms_order_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT="秒杀订单";