前言
继上一篇积分领取&消耗&回收 之后, 基本上就能满足大部分公司的业务需求了; 但是, 还有有部分公司业务可能会涉及到冻结&解冻(比如金融交易公司), 再配合上回收可以说处理复杂度又上了一层;
结构设计
用户积分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"` // 冻结积分数
}
消耗功能
需求
流程图
冻结功能
需求
流程图
解冻功能
需求
流程图
冻结扣除功能
需求
流程图
结语
至此应该就是整体的任务中心积分逻辑了, 暂时想不到更复杂的场景了, 大家有什么更复杂的需求可以提出来一块讨论一下, 或者有什么性能更优的处理方案欢迎分享;