手摸手教你写任务中心-积分冻结&解冻&消耗

前言

继上一篇积分领取&消耗&回收 之后, 基本上就能满足大部分公司的业务需求了; 但是, 还有有部分公司业务可能会涉及到冻结&解冻(比如金融交易公司), 再配合上回收可以说处理复杂度又上了一层;

结构设计

表接口还是继续沿用之前的设计, 只需要增加对应枚举即可;

用户积分key(redis)

积分为了保证性能用redis的hash进行存储, 每个用户一个key, 维护可用积分, 冻结积分, 可用相关的流水以及总领取积分数的状态;


IntegralInfo struct {
  Available       int64           `json:"available"`       // 可用
  AvailableStream []*IntegralItem `json:"availableStream"` // 可用流水
  Total           int64           `json:"total"`           // 总领取
	Frozen          int64           `json:"frozen"`          // 冻结
}
IntegralItem struct {
  StreamId  uint             `json:"streamId"`  // 流水Id
  TaskId    string           `json:"taskId"`    // 任务Id
  Available int64            `json:"available"` // 可用
  OutTime   int64            `json:"outTime"`   // 过期时间
  Frozen    map[string]int64 `json:"frozen"`    // 冻结积分数
}

消耗功能

需求

  1. 允许多端多点同时进行积分使用;
  2. 实时进行抵扣, 不允许后置;
  3. 删除redis中无效的可用流水(含有冻结的保留);
  4. 不影响当前的性能;

流程图

image.png

冻结功能

需求

  1. 允许多端多点同时进行积分冻结;
  2. 积分冻结期间不触发回收;
  3. 冻结的积分不可再被使用;

流程图

image.png

解冻功能

需求

  1. 单笔冻结积分全部解冻;
  2. 解冻后如果过期则直接触发回收;
  3. 解冻后未过期则恢复可用;

流程图

image.png

冻结扣除功能

需求

  1. 单笔冻结积分全部扣除(不处理过期);
  2. 删除redis中无效的可用流水;

流程图

image.png

结语

至此应该就是整体的任务中心积分逻辑了, 暂时想不到更复杂的场景了, 大家有什么更复杂的需求可以提出来一块讨论一下, 或者有什么性能更优的处理方案欢迎分享;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小僵尸打字员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值