微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

redis实现商品秒杀业务的正确姿势

结论:双重reddision锁+redis的pop操作+失败回滚机制

1.选择reddision而不用redis原生锁是因为reddsion有线程排队等待机制,防止大量的请求因为拿不到锁而直接导致失败

2.第一层锁的目的是过滤掉并发的下单请求,让拿不到锁的线程排队等待,key为商品id

3.第二层锁的目的是过滤掉同一个人的多次下单请求,防止一人下多单,key为商品id:userId

4.通过redis的pop操作,过滤掉那些在已经售空之后发出的下单请求,减轻数据库压力。

5.pop操作不能放在第一层,必须要在锁的里面,防止有失败导致商品回退的情况发生,导致先进来的请求因为没有等到回退的商品反而抢购失败。

6.发生异常,则redis数据库都进行回滚。此时分两种情况:

  1)pop成功,但是操作数据库失败,此时回滚后redis数据库中的数据都是正确的

  2)pop失败,此时回滚后redis中的数据会多一个,但是不影响,因为最终是以数据库下单成功为准,相当于只是多出来一次无效请求。

7.数据库是最后一道关卡,update ...  where 库存>0,防止超卖。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐