.example_responsive_1 { width: 200px; height: 50px; } @media(min-width: 290px) { .example_responsive_1 { width: 270px; height: 50px; } } @media(min-width: 370px) { .example_responsive_1 { width: 339px; height: 50px; } } @media(min-width: 500px) { .example_responsive_1 { width: 468px; height: 50px; } } @media(min-width: 720px) { .example_responsive_1 { width: 655px; height: 50px; } } @media(min-width: 800px) { .example_responsive_1 { width: 728px; height: 50px; } } (adsbygoogle = window.adsbygoogle || []).push({});
目录
秒杀场景实践之抢红包常用解决方案 文章地址: https://cloud.tencent.com/developer/article/1557573
秒杀场景在生活中几乎随处可见, 不论是商品抢购、春运抢票还是一个随处可见的红包, 都会涉及到秒杀的场景. 在面试中, 秒杀业务的设计也成为热门题目为面试官和应聘者津津乐道.
接下来, 本文将针对秒杀场景中的抢红包实现方案进行分享, 包括红包业务常见的实现方案, 瓶颈及优化.
红包的应用场景有很多, 如随机红包、定额红包等, 甚至还有结合其他促销业务的红包变种如抢购物津贴等. 但从技术的角度来看, 不论玩法有多少变化, 其核心都是相似的:
抢红包可能会由于业务需求不同而产生很多变种, 设计上要足够抽象, 不能为了抢现金红包和抢购物津贴红包写多份相似的代码. 抢到红包的后置操作可以作为消息, 由不同的业务模块自行处理.
抢红包核心业务不复杂, 其关键点在于应对高并发、资源争用等.
红包数量相对合理, 很少产生库存剩余的情况、用户量级不大的情况.
预分配是在发放红包时, 根据红包总额和数量、按照既定算法进行分配, 提前创建好全部的红包分配记录. 领取时只是将红包分配记录进行更新.
比较适合系统发放的红包(面向某一标签的全部用户群体, 发出的红包基本会被领取完), 不适合用户群组红包(无法控制领取红包人数, 当红包个数远大于群组人数的情况下, 无效数据比较多, 比如在一个10人群组发放一个数量为1000的红包).
graph LR
A(创建红包, 个数为N) --> B(预分配N条红包领取记录)
B --> C(开始抢红包)
C --> D(先到先得)
红包发放记录
ID | 总金额 | 数量 | … |
---|---|---|---|
1 | 100 | 3 | … |
红包分配记录
unique:
红包ID
+领取用户ID
ID | 红包ID | 金额 | 领取用户ID | 领取时间 | … |
---|---|---|---|---|---|
1 | 1 | 10 | -1 | 0 | … |
2 | 1 | 60 | -2 | 0 | … |
3 | 1 | 30 | -3 | 0 | … |
UPDATE IGNORE ... LIMIT 1
: 解决了资源争用问题, 确保并发请求下红包的领取的数据正确性. red_envelop_id
+ user_id
: 创建索引并唯一约束, 确保对于同一个红包同一用户只能领取一次.user_id
为负值: 因为red_envelop_id
+ user_id
有唯一约束.版权声明
本文发布于[朴瑞卿的博客](https://blog.piaoruiqing.com/), 允许非商业用途转载, 但转载必须保留原作者[朴瑞卿](https://blog.piaoruiqing.com/) 及链接:[https://blog.piaoruiqing.com](https://blog.piaoruiqing.com/).
如有授权方面的协商或合作, 请联系邮箱: [piaoruiqing@gmail.com](https://blog.piaoruiqing.com/mailto:piaoruiqing@gmail.com).
领取人数无法估计、频发退款, 如群组红包(经常发生剩余退款)
graph LR
A(创建红包, 个数为N) --> B(首次写入缓存)
B --> C(抢红包)
C --> D(读取或加载缓存)
D --> E(分配红包金额)
E --> F(写入缓存--原子操作)
F --> G(落库)
红包发放记录
ID | 总金额 | 数量 | 剩余金额 | 剩余数量 | … |
---|---|---|---|---|---|
1 | 100 | 3 | 100 | 3 | … |
红包分配记录
unique:
红包ID
+领取用户ID
ID | 红包ID | 金额 | 领取用户ID | 领取时间 | … |
---|---|---|---|---|---|
| … | … | … | … | … |
秒杀场景其特点是高并发、读多写少、资源争用, 每一个点都需要根据其业务场景选择适合的解决方案, 如使用缓存解决频繁读取的问题、使用队列解决数据库性能瓶颈等.
对于抢红包业务来说, 预分配和实时分配都是行之有效的方案, 各有优劣, 具体选择哪种, 还是要看业务需求.
© 2019, 朴瑞卿.
版权声明
本文发布于[朴瑞卿的博客](https://blog.piaoruiqing.com/), 允许非商业用途转载, 但转载必须保留原作者[朴瑞卿](https://blog.piaoruiqing.com/) 及链接:[https://blog.piaoruiqing.com](https://blog.piaoruiqing.com/). 如有授权方面的协商或合作, 请联系邮箱: [piaoruiqing@gmail.com](https://blog.piaoruiqing.com/mailto:piaoruiqing@gmail.com).
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有