标签:姿势 回滚 请求 数据库 redis pop 秒杀 下单
结论:双重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,防止超卖。
标签:姿势,回滚,请求,数据库,redis,pop,秒杀,下单 来源: https://www.cnblogs.com/hongzuiliyu/p/15037712.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。