Springboot 实现红包发送和领取业务

墙外行人,墙里佳人笑。

1 前言

在前文中讲述了红包发送的算法以及对应的存储,以及红包的领取以及抢红包,在本文中将继续完善红包的内容,包括红包的发送表和领取表的设计,以及红包 24 小时超时退回的处理方式,将红包的业务构建成一个完整的闭环,形成一个真正完整的业务,分享作者在这个过程中的思考和心得。

2 红包发送

红包的发送和领取采用了策略模式,红包的发放分为个人红包和群红包两种模式。红包发送的逻辑是先计算每个红包的金额,将红包发送的数据存入数据库中,然后将红包的信息放入缓存中,缓存的 key 为红包的订单号,value 即红包的列表。

如下图群红包逻辑所示,具体实现类群红包 GroupRedPkg 中,有具体的红包算法,红包列表和红包信息的保存全部放在右侧的抽象类中,这些信息在个人红包(个人红包金额都是固定的,这里就不做展示,具体的代码可以参见项目源码)的场景下也是可以使用的,实现了相同业务的内聚。

在群红包中,计算完每个红包的金额后,需要将红包的顺序进行乱序操作 Collections.shuffle(nodeList);,这样也可以保证在领取红包时的随机性。

对于红包的发送,在计算完每个红包的金额后,需要先记录红包的发送流水,然后调用 C 端的交易接口,实际扣除用户的金额,操作完成之后,需要修改流水的状态,至此才能说红包的发送业务完成。红包的发送包含三个核心环节,红包的计算,流水的记录和修改、账户余额的扣减。

3 红包领取

红包的领取需要从缓存 redis 中获取一个红包单,判断是否超时以及是否存在,之后查询发送红包的记录,如果前置校验通过后,需要先记录红包领取人的领取记录,然后调用账户的入账接口,如果账户入账失败,需要将红包再次放入红包列表中,否则红包就丢失了。当入账成功后,需要修改入账记录为成功,然后返回结果。

领取红包,需要在红包领取入口加上分布式锁,防止红包的超额领取。

红包的领取和红包的发送时相似的,需要记录领取红包者的领取记录,用户账户增加余额,修改领取记录的状态,至此红包的领取业务完成。

4 红包退回

已经讲述了红包的发送和领取,还有一种特殊的情况,当红包超时(一般是 24h)需要将红包原路退回,或者红包剩余金额未领取超时,此种情况也需要进行退回操作。

红包退回的操作处理逻辑稍微复杂,但是是一个批量任务,可以通过定时任务触发。首先需要查询超时的红包发送记录,删除缓存中的 key, 找到可能存在的红包领取记录,计算其领取金额,红包总金额减去红包领取金额即红包需要退回的金额,如果退回金额不为零,需要操作退回,如果红包已经领取完毕,需要将红包打标,记录已经处理完毕,下次定时任务就不会处理。

5 总结

在本文中,介绍了红包的发送业务、领取业务和红包退回,实现了业务的闭环处理,对应环节的数据需要记录到数据库中,记录到数据库中后再进行账务的操作,这个记录不仅实现了业务的记录,也可以实现业务的幂等。在后续文章中,将介绍 C 端业务和 B 端的应用场景。项目 github 地址 springboot-auth

相关推荐
00后程序员3 分钟前
iOS 上架 4.3,重复 App 审核条款的真实逻辑与团队应对策略研究
后端
00后程序员12 分钟前
专业的 IPA 处理工具 构建可维护、可回滚的 iOS 成品加工与加固流水线
后端
百度Geek说17 分钟前
项目级效能提升一站式交付最佳实践
后端
今天你TLE了吗28 分钟前
通过RocketMQ延时消息实现优惠券等业务MySQL当中定时自动过期
java·spring boot·后端·学习·rocketmq
Gundy30 分钟前
构建一个真正好用的简单搜索引擎
后端
疯狂的程序猴36 分钟前
构建面向复杂场景的 iOS 应用测试体系 多工具协同下的高质量交付实践
后端
大巨头43 分钟前
C# 中如何理解泛型
后端
用户992441031561 小时前
TRAE SOLO实战录:AI应用可观测性与风险管控的破局之道
后端
Dr丶net1 小时前
🔥NestJS 接口文档神器!nestjs-knife4j-plus 让 Swagger 颜值与功能双飞跃
后端
我家领养了个白胖胖1 小时前
arthas 我愿称为最强辅助工具
java·后端