秒杀流程和常见问题

文章讲述了如何通过Redis预减库存、lua脚本保证原子性和MQ进行消息传递,确保秒杀过程中的库存管理和事务一致性。同时讨论了系统异常如宕机、消息失败等情况下的补救策略以及防止重复秒杀的优化措施。
摘要由CSDN通过智能技术生成

1. 先把库存信息预先加载到redis;

2. lua脚本保证原子性:查redis,判断是否有库存,若有,则redis预减库存,执行3;否则直接返回;

3. 把秒杀消息发送给MQ,MQ要做的事:查mysql,若库存大于0,则减库存,成功则插入订单;否则把redis的库存加回去(消费失败,补库存)。(这条消息加上事务注解,保证ACID特征)

肯定不会超卖,但极端情况有可能发生少卖的情况:

A. redis预减库存成功,但没把秒杀消息发出去,挂了,解决方式:再次上线时,重新加载库存信息到redis;

B. redis预减库存成功,但消息发送失败,超过了重试次数,解决方式:补库存;

C. 消费者消费失败(根据具体业务来判定什么叫消费失败),解决方式:补库存。

防止同一用户重复秒杀:订单号是唯一的,肯定能防止重复(插入时发现违反唯一性,报错,回滚),但可以做个优化,在redis查库存前,用redis的setnx命令把用户id(保证唯一性即可)存入redis,设置失效时间,若发现已存在,直接返回。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值