优化:静态页面
图片资源采用云存储
cdn加速
- 秒杀前
- 将秒杀商品的数量存入redis的num队列中,键名为商品sku的id,值为1
- 用进入详情页面,判断队列(num与uid队列中是否都没数据)中是否有数据,没有则添加数据,不需要定时任务,减少系统资源的占用(控制进入后台的用户量)
- 用户点击立即购买
- 从num队列中lpop一个值
- 如果值不为空,在redis的uid队列中lpush用户的id(表示用户可以跳到支付页面)
- 如果为空,则告知用户库存不足,不能购买
- 生成用户订单
- 对数据库进行减库存操作(考虑高并发)
- 使用mysql的悲观锁(for update)对库存进行减操作(注意:必须使用事务,操作失败必须进行回滚操作,否则会发生死锁)
- 使用MySQL的乐观锁对库存进行操作(一个字段代表版本号,改之前以及之后的版本号是否相等,利用数据库的原子性)
- 将订单放入延时消息队列(设置定时任务)
- 设置5分钟后查询订单的状态,
- 若已经付款,不做操作,
- 若用户未支付,则将此用户的id从uid队列中剔除,在num队列中lpush一个1,代表商品数量加一,即回库存
- 用户支付完成(调用支付时设置过期时间),异步回调改变订单状态,