微信读书的书币逻辑是怎样做到独立过期的呢?

查看 478|回复 40
tinytoadd   
使用书币是先用快过期的还是先用新领取的。
zero47
OP
  
@caotian 我也觉得短期过期太复杂了,话费信用卡的积分都一年清算一次
qeqv   
感觉最简单的方法就是你正文提到的了,别的逻辑都很复杂。
1. 购买时更新 30 条记录也没什么
2. 总额可以做缓存,余额变动时更新
3. 1 个 2 块书币奖励可以设置成两条 1 书币记录
futuretech6   
感觉是类似 NFT 的实现,每个 token 有自己的 id 和过期时间,然后整体也会维护一个 token 数量信息
runzekk   
sum 也没什么问题,冗余存也没什么问题,量不大,没有大事物都不是问题
444571840   
如果要实现的话要挺容易的,数据库一个字段就能解决。
记录的时候 [获得书币 A ,到期时间戳 1 。获得书币 B ,到期时间戳 2 。xxx],每次要写入新数据的时候,先判断是否有已经到期的书币,删除了,再在字段后面添加(新活动书币,新到期时间戳)即可。
客户端每次要展示的时候,根据当前时间戳把数据库未到期的 sum 一遍就好了。
其他查历史的话看 log 就好。
mrgeneral   
总和可以是单独的数据,过期是定时任务就能解决,流水信息可以定期归档,实际数据量不大。
janus77   
领取时一条一条更新
使用时只需要更新一下总数字就行了,只有一次啊
hanbin   
两个表:
CREATE TABLE PointsRecord (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增 ID',
user_id INT NOT NULL COMMENT '用户 ID',
points_amount INT NOT NULL COMMENT '积分数量',
receive_time TIMESTAMP NOT NULL COMMENT '领取时间',
expiration_time TIMESTAMP NOT NULL COMMENT '过期时间',
status VARCHAR(20) NOT NULL COMMENT '状态',
receive_source VARCHAR(50) NOT NULL COMMENT '领取来源',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '积分领取记录表';
CREATE TABLE PointsWallet (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '积分钱包 ID',
user_id INT NOT NULL COMMENT '用户 ID',
points_balance INT NOT NULL DEFAULT 0 COMMENT '积分余额',
total_points INT NOT NULL DEFAULT 0 COMMENT '积分总额',
used_points INT NOT NULL DEFAULT 0 COMMENT '已用积分总额',
expired_points INT NOT NULL DEFAULT 0 COMMENT '已过期积分总额',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '积分钱包表';
领取积分:
PointsRecord 入库一条记录,PointsWallet 更新 total_points & points_balance ,事务处理
过期积分:
PointsRecord 更新一条数据,PointsWallet 更新 total_points & points_balance & expired_points ,事务处理
积分消费:
PointsWallet 更新 used_points & points_balance
过期积分用脚本处理
积分消费时判断余额够就允许消费。
hanbin   
@hanbin 将积分领取和积分消费解耦,消费时不关心积分的有效期属性,积分的有效属性也不关心消费的具体场景,只关心额度变化即可。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部