前言
继上一篇积分领取&消耗&回收 之后, 基本上就能满足大部分公司的业务需求了; 但是, 还有有部分公司业务可能会涉及到冻结&解冻(比如金融交易公司), 再配合上回收可以说处理复杂度又上了一层;
结构设计
表接口还是继续沿用之前的设计, 只需要增加对应枚举即可;
用户积分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"` // 冻结积分数
}
消耗功能
需求
- 允许多端多点同时进行积分使用;
- 实时进行抵扣, 不允许后置;
- 删除redis中无效的可用流水(含有冻结的保留);
- 不影响当前的性能;
流程图
冻结功能
需求
- 允许多端多点同时进行积分冻结;
- 积分冻结期间不触发回收;
- 冻结的积分不可再被使用;
流程图
解冻功能
需求
- 单笔冻结积分全部解冻;
- 解冻后如果过期则直接触发回收;
- 解冻后未过期则恢复可用;
流程图
冻结扣除功能
需求
- 单笔冻结积分全部扣除(不处理过期);
- 删除redis中无效的可用流水;
流程图
结语
至此应该就是整体的任务中心积分逻辑了, 暂时想不到更复杂的场景了, 大家有什么更复杂的需求可以提出来一块讨论一下, 或者有什么性能更优的处理方案欢迎分享;