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

2024 年 4 月 19 日
 zero47
有点好奇微信读书的书币系统是怎么实现的。微信读书每天阅读可以获得书币奖励,基本每天能领取 1 到 2 个,而这些领取的书币都有独立的有效期,貌似一个月。如果每笔领取记录都单独过期,意思是一个月可能会有 30 多笔记录。假设每笔都是 1 个书币,难道买本 30 块的电子书要更新 30 条记录?每次查看余额都要 sum 一下记录?
7150 次点击
所在节点    程序员
46 条回复
yefuchao
2024 年 4 月 19 日
余额就是一个数字,过期时间到了给你扣掉不就好了
NoOneNoBody
2024 年 4 月 19 日
硬件足够的话,数据越细越好
不需要每次计算,缓存,或者保存预计算结果就可以了
zero47
2024 年 4 月 19 日
@yefuchao 不能吧,他付款肯定是先用旧的奖励记录,那就必须每笔记录是否被消费都记
Donjote
2024 年 4 月 19 日
更新 30 条记录也没啥吧,余额可以存另外一个表里
Subfire
2024 年 4 月 19 日
跟游戏开发中的道具类似, 每次获得的书币道具, 只是 configId 一样, 但是 instanceId 是新增的, 不同 instanceId 的道具都有独立的有效期. 扣减书币道具的时候, 优先扣减即将到期的
xxxaadsdss
2024 年 4 月 19 日
每次领取都是一条领取记录。领取的商品有过期时间。到时间了。减一下总表的 书币数就好了
zero47
2024 年 4 月 19 日
想了想还有一个情况是,30 块的交易,用户有 29 个 1 块书币奖励和 1 个 2 块书币奖励,还得在最后一个 2 块奖励里记录消费了 1 块,还有 1 块没被消费,这太不优雅了吧
zero47
2024 年 4 月 19 日
@xxxaadsdss 这只能解决 sum 的问题,实际消费还得一条一条的更新奖励记录
NessajCN
2024 年 4 月 19 日
参考比特币的区块嘛
做一个表,只记录交易信息,譬如 xxxx(时间戳) 入账 1 币,一个月后该条交易记录失效
消费的时候就是手动将依然在有效期内的前 3 条 1 币交易记录失效,如果是入账 3 币只消费 2 币的记录就失效掉 3 币的记录重新生成一条基于原时间戳的 1 币记录
余额计算就是简单的所有有效入账记录求和
zero47
2024 年 4 月 19 日
@NessajCN 是的,就是觉得这逻辑太重了,在微信读书这种大体量用户下,这个独立过期逻辑有点自己坑自己的意思
NessajCN
2024 年 4 月 19 日
@zero47 不重啊......你自己试一下就知道了,没啥计算量的,也就 IO 多一些。不过这种程度的 IO 相对微信本身那就是毛毛雨了
Rickkkkkkk
2024 年 4 月 19 日
每条领取记录都是库里一条记录
定期跑离线任务去库里把数据都过期掉
算余额会把库里的值全部加起来


这里会出现几个问题:
跑全量任务更新过期会不会太重了? (记录很多, 真正要过期的很少)
每次算余额要把所有的记录加起来会不会慢查询?

(留为作业吧)
Fish1024
2024 年 4 月 19 日
领取的时候就写入了这些币的过期时间,到时间自动过期了。
tomatocici2333
2024 年 4 月 19 日
@Fish1024 我感觉也是 写个定时任务扫描过期
caotian
2024 年 4 月 19 日
之前做一个简单的系统想积分带过期功能,硬着头皮做了类似的方案,基本也实现了需求,结果最后做到退款功能时,还是给整破防了,因为还要考虑退款时退积分,退的积分要根据退款金额计算,退的积分还要保持原来的过期时间,还要考虑退款时,退回的积分有可能已经过期了,过期的积分是直接过期,还是根据规则折算成新积分,感觉本来一个简单的功能越做越复杂,最后索性不做积分过期功能了
deltadawn
2024 年 4 月 19 日
按每月存 1 条记录,初始值为 32 个 0 ,签到的时候把当前天数那一位改成获得的金币数,过期只要把上个月当前天那一位改成 0 ,扣钱的时候,从上个月当天开始循环减。这样数据库操作就少了
jookr
2024 年 4 月 19 日
先进先出呗。
先获取的,先到期/先使用
ashuai
2024 年 4 月 19 日
balance 另有个 detail 表,独立过期时间就行了,不是啥麻烦事
nqlair
2024 年 4 月 19 日
存成 sortedMap ,key 是过期时间,value 是积分,每次登录把过期的删除,积分就是未过期的所有 value 的和,使用时候优先扣过期时间近的
0d
2024 年 4 月 19 日
使用书币是先用快过期的还是先用新领取的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1033839

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX