1. 实现高并发的秒杀系统,解决秒杀抢购系统的难点与困难,避免商品超卖 。
技术栈(redis + springboot +mysql)
2. 项目设计:
先进先出的队列,例:商品为100份,使用长度为 100的队列,实现消费者生产者模式,生产者负责接收用户秒杀任务,将订单号投送到队列中( 条件:队列未满 )投送成功设置订单状态投送成功,消费者pull队列订单号实现扣减库存操作。
3. 处理流程:
步骤1:开启秒杀前24小时告诉用户,提交订单支付定金,提前在数据库生成秒杀订单设置订单初始化状态(此阶段TPS不高,降低系统整体负载)。
步骤2:当JAVA生产者线程处理秒杀请求:
查看是否存在秒杀订单数据(可以查询数据库,提前缓存到应用),
投送订单到(redis)成功,设置数据库订单状态投送成功后,可直接返回用户秒杀成功。
步骤3:由JAVA消费者线程去实现数据库存扣减库存
注意1:使用redis实现队列,多线程消费者去投送订单,如果因队列已满,库存为空秒杀业务已结束。
注意2:消费者去实现库存扣减,(此阶段秒杀基本结束对TPS要求不高)。
4. 优点
设置固定大小的队列(商品:100份,长度:100队列):避免商品超卖。
处理提前延后,通过提前生产秒杀订单数据,延后处理扣库存,降低系统负载。
主要负载集中在,订单投送过程。
5.双重检查(double check):检查(redis)队列+数据库数据状态
生产者:投递队列成功,要设置数据库中订单状态。
消费者:消费秒杀订单时,要检查是否存在队列,订单状态是否投递成功。
浙公网安备 33010602011771号