逛知乎时偶然发现一篇微信红包的实战案例,阅读之后对文章的实现思路有些自己的看法,所以分享给各位小伙伴。
首先说明后续会使用到的技术工具:SpringBoot+Redis+Mysql+Mybatis等(本文主体展示微信红包功能的实现思路与高并发与分布式场景下的解决方案)
1.业务流程
相信大家都使用过微信抢红包功能,业务流程如下:
1.土豪发红包:
a.设置红包金额
b.设置红包数量
2.我们去抢土豪发出的红包
a.手快-获得随机金额红包
b.手慢-红包被抢完
这里有几个隐藏的逻辑:
1.土豪发红包时,设置的金额与数量是有最小金额限制的------单个红包金额不可低于0.01元
2.抢红包时,如果红包数大于1,即使最后一个抢的伙伴只要红包没有被抢完就一定可以抢到钱(不会有空的红包,如最小红包的金额也会是0.01元)
举个栗子:总金额0.03元,红包个数3个,那么第一个人永远只能抢到0.01元,因为必须要给剩下的两个红包留0.02元
2.高并发实现思路
1.发红包时,业务校验通过后,减去土豪钱包中对应的金额,操作成功后开始创建红包
2.红包在创建时,根据红包数量分配好金额直接入库拿到红包主id和每个小红包的子id,根据主id生成key将子id集合存入redis list结构的栈空间
3.抢红包时,根据客户端传递来的红包主id从栈中推出一个子id(如果推出为null说明该主id的红包已被抢光),这样就实现了高并发与分布式下数据的原子性。
4.抢红包时,抢到红包的用户根据子id,使用异步方式(mq消息队列等)修改红包表记录,并给相应用户增加抢到的金额。
5.客户端可以通过红包主id来查询该红包都被谁抢到、抢到的时间、抢到多少钱、谁手气最佳等信息。
第二部分更新内容:红包创建思路与JAVA实现代码,未完待续;
原创文章,欢迎指正讨论,如需转载请标明出处。