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

墙外行人,墙里佳人笑。

1 前言

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

2 红包发送

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

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

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

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

3 红包领取

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

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

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

4 红包退回

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

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

5 总结

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

相关推荐
IT_陈寒10 分钟前
React状态更新延迟搞晕我,原来是闭包在捣鬼
前端·人工智能·后端
卓怡学长22 分钟前
w273基于springboot的智能笔记的开发与应用
java·spring boot·spring·intellij-idea
RainCityLucky1 小时前
Java Swing 自定义组件库分享(十三)
java·笔记·后端
码事漫谈10 小时前
别写Prompt了,现在流行给AI“写循环”
后端
Kyrie_Li11 小时前
Spring Boot Kafka 生产级配置全解析:从入门到精通
spring boot·后端·kafka
Coder_Shenshen12 小时前
西门子S7CommPlus协议鉴权算法原理与流程详解
网络·后端·算法
yuhaiqiang12 小时前
随手 vibecoding 的浏览器插件已经 6000 多次下载,聊聊他的产品设计
前端·后端·面试
geovindu14 小时前
python: Functional Options Pattern
开发语言·后端·python·设计模式·惯用法模式·函数式选项模式
卷无止境16 小时前
C++ 存储类说明符(Storage Class Specifier)大横评
c++·后端
用户0190275816116 小时前
量化数据的 batch 接口有多好用?从 1 只到 500 只,批量拉数据的正确姿势
后端