1. 流程图
2. 详细设计
抽奖前流程:
库存预热,即将MySQL中的库存信息(抽奖次数)存入Redis中
抽奖中流程:
对Redis中的key进行decr(减一)操作,返回一个结果stock
如果stock < 0,则说明库存不足,直接回滚,抽奖失败
如果stock >= 0,则进行后续加锁步骤
以活动编号+库存编号的方式加分布式锁(这一步本质上是一个兜底操作,假设一个库存总量为100,Redis扣减到了98,但是因为某些原因,比如网络抖动等,Redis中的数据又变成了100,这时候如果没有这步加锁操作,就会导致超卖)
如果获取锁失败,则抽奖失败
如果获取锁成功,则向MQ发送延迟消息,异步更新数据库实现最终一致性