1. ⾸先查询redis缓存库存是否充⾜
2. 先扣库存再落订单数据,可以防⽌订单⽣成了没有库存的超卖问题
3. 扣库存的时候先扣数据库库存,再扣减redis库存,保证在同⼀个事务⾥,⽆论两者哪⼀个发⽣了异常都会回滚。有⼀个问题是可能redis扣成功了由于⽹络问题返回失败,事务回滚,导致数据库和缓存不⼀致,这样实际少卖了,可以放到下轮秒杀去。
这种做法能⼀定程度上解决问题,但是也有可能会有其他问题。⽐如当⼤量请求落在同⼀条库存记录上去做update时,⾏锁导致⼤量的锁竞争会使得数据库的tps急剧下降,性能⽆法满⾜要求。
另外⼀种做法就是排队,在服务层进⾏排队,针对同⼀个商品ID的也就是数据库是⼀条库存记录的做⼀个内存队列,串⾏化去扣减库存,可以⼀定程度上缓解数据库的并发压⼒。
网友评论