发红包和抢红包的后端时序图(预先分配红包)

发红包功能和抢红包功能,代码写的比较烂。就不贴了,就简单画个时序图记录一下思路。

整体思路

  1. 使用缓存控制流量
  2. 数据库作为数据正确性的兜底。
  3. 数据库事务中,先获取红包的排他锁,这样其他对同一红包操作线程就只能等待了,可以安心做完自己的处理
  4. 由于缓存并不100%可靠,增加缓存数据恢复机制,发现缓存数据和数据库不一致情况。加分布式锁恢复数据,其他线程先快速失败

1.数据模型:

1.1红包记录:

字段备注
红包id字面意思
红包总额字面意思
红包个数记录分成了几个
剩余红包个数剩余数初始=红包个数

1.2 红包明细记录:

字段备注
红包明细id字面意思
红包id这条明细归属的红包id
金额记录这个明细是多少钱
归属人获得红包的人,初始是空

2.时序图

2.1发红包

用户 服务器 数据库 缓存 我要发个200分给5个人的红包 先给200随机分配十个红包。这里得到1个红包id和10个红包明细id 保存红包记录和红包明细记录 红包是否结束标记。0未结束,1已结束。 如:{key=rp:红包id:end,val=0} 红包待抢的明细id集合。 如:{key=rp:红包id:items,val=[1,2,3,4,5]} 发红包成功 用户 服务器 数据库 缓存

发红包比较简单,如果担心重复请求的话,可以适当加个锁。

2.2抢红包

抢红包中有些情况会触发2.3,这个功能代表缓存数据修复。

用户 服务器 缓存 数据库 我要抢id为1的红包 获取指定红包的结束标记 已结束的话响应红包已抢完。 (缓存无信息的话触发2.3,然后响应用户抢红包失败之类的友好提示) 针对用户对当前抢红包加锁。 如:{key=rp:红包id:用户id,val=uuid} 弹出一个待抢红包明细id 未成功获取红包明细id。 (缓存无信息的话触发2.3,然后响应用户抢红包失败之类的友好提示) 开启事务 1.乐观锁减少一个 红包记录 中 剩余红包个数。 如:update tab set count=count-1 where id=1 and count>0 2.查询所有 红包明细记录 归属人是当前抢红包人的个数。 如:select count(*) from tab where id=1 and user_id=1 3.乐观锁更新 红包明细记录 中 归属人。 如:update tab set user_id=1 where id=1 and user_id is null 4.获取 红包明细记录 中的金额 1或者3失败,或者2中返回大于0。 (上述条件为false触发2.3,然后响应用户抢红包失败之类的友好提示) 提交事务 释放针对用户对当前抢红包锁。 抢红包成功,返回金额 用户 服务器 缓存 数据库

2.3缓存数据修复

由于缓存并不是十分可靠,考虑可能出现缓存和数据库不同步的情况而做出的修复流程。

服务器 缓存 数据库 红包修复加锁。 如:{key=rp:红包id:reload,val=uuid} 获取红包记录和红包明细记录 红包是否结束标记。0未结束,1已结束。 如:{key=rp:红包id:end,val=0} 红包待抢的明细id集合。 如:{key=rp:红包id:items,val=[1,2,3,4,5]} 释放红包修复锁。 服务器 缓存 数据库
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值