本书未发布
秒杀系统解决超卖
前提
秒杀活动一定是高并发的,在那一秒,无数的用户抢购商品,如果我们每个请求过来,都要与数据库进行交互,那么 Mysqt 一定是扛不住的,所从我们的秒杀要基于 redis 来进行。 Redis 单机支撑每秒几万的写入。这样性能不是问题。在我们发布秒杀活动的时候,妥将我们的商品与库存写入 redis 。当用户进行抢购的同时,我们直接对 redis 的库存进行操作。扣减 redis 内库存数量后,发送扣减成功的消.息到消息队列,由后续的订单服务,支付服务之类的进行处理。最后再由 mysql 进行库存扣减。
解决超卖
将库存名领加载到了 Redis,必须要保证精确计数。如果 redis 的库存数量错误,就会导致超卖的问题产生。在秒杀的时候分为两步。
第一步:判断库存名额是否充足。
第二步:减少库存名额,扣减成功就是抢到。
我们必须要保征两种操作的原子性。所从我们要使用 lua 脚本, redis 的特性,专门支持原子。
解决少卖
还有一种情况,我们解决了超卖是防止超过我们的库存量,那么会不会有一种情况是我扣减了库存,但是消息没发出,订单生成失败,导致我没有卖成功呢。我们扣减库存后,发送消息队列,这里要有重试策咯,如果发送消息失败进行重试,超过重试次数后,则要持久化磁盘,由补偿服务来进行扫描,进行后续业务处理。类似于 mysqL 的日志持久化。
推荐文章: