签到和积分系统 逐字稿
签到和积分系统 逐字稿
签到和积分系统是许多应用程序中常见的功能,用于激励用户参与和增加用户粘性。以下是关于签到和积分系统的一些关键点和设计考虑:
实现方式:
积分系统是在签到系统基础上延伸出的,根据签到的天数来获取积分,也可以通过其他学习行为获取,所以把积分和签到分为两个微服务
1.连续签到奖励:为连续签到的用户提供额外奖励,如连续签到 7 天奖励更多的积分或特权。这可以进一步激励用户保持连续签到。
2.签到记录:记录用户的签到日期和连续签到天数,通常可以使用 Bitmap 来存储签到信息。
3.异常处理:处理用户在签到过程中可能遇到的问题,如重复签到、签到失败等。
4.积分存储:记录用户的积分,使用数据库存储,月底清零功能可以使用定时任务来完成
5.积分计算:根据用户的操作和行为,计算并更新用户的积分。
6.积分查询:提供用户查询积分余额和积分获取记录的功能
7.积分清零:在用户积分过期或达到一定条件时,清零用户的积分。
业务逻辑:
1.签到操作:用户点击签到按钮后,系统记录签到日期,并更新连续签到天数。
2.签到奖励发放:根据用户的签到情况,发放相应的积分。
实现思路:
1.查询签到
需要把当前登录用户本月第一天到今天为止的所有签到过的日期 显示,
使用redis的bitmap数据类型存储,bitmap是二进制结构,它通过使用单个 bit 来表示每个值的状态,从而极大地节省了存储空间。在需要存储大量布尔值的情况下,使用 Bitmap 可以显著减少存储空间。
我们必须把签到记录返回,具体来说就是每一天是否签到的数据。是否签到,就是0或1,刚好在前端0和1代表false和true,也就是签到或没签到。
因此,每一天的签到结果就是一个0或1的数字,我们最终返回的结果是一个0或1组成的数组,对应从本月第1天到今天为止每一天的签到情况。
2.新增签到
用户每天都可以签到一次,而在后台,要做的事情就是把BitMap中的与签到日期对应的bit位设置为1,另外,为了便于统计,我们计划每个月为每个用户生成一个独立的KEY,因此KEY中必须包含用户信息、月份信息,长这样: sign:id:xxx:220301 #sign:uid:用户id:年月
首先判断是否是今天第一次签到,不可以重复签到,组装签到记录保存到bitmap中,获取连续签到的天数,从bitmap中获取数据转换为二进制
(1)首先确定连续签到的结束位置
查找最近的签到记录:在连续签到业务中,通常需要确定用户最近一次签到的日期。从后向前遍历可以快速找到最近的签到记录(即最后一个为 1 的 bit 位),从而确定连续签到的结束位置。
避免不必要的遍历:如果从前往后遍历,可能需要遍历整个 Bitmap 才能找到最近的签到记录,而从后向前遍历可以更快地定位到目标,提高效率。
(2)计算连续签到天数
从最近的签到开始计算:一旦确定了最近的签到记录,从该位置开始向前遍历,可以方便地计算出连续签到的天数。每遇到一个为 1 的 bit 位,连续签到天数加 1,直到遇到一个为 0 的 bit 位为止。
简化逻辑:从后向前遍历可以简化连续签到天数的计算逻辑,因为只需要从最近的签到记录开始向前累加,而不需要从头开始遍历整个 Bitmap。
3.新增积分
积分通过签到服务和其他微服务中的行为获取,并基于积分形成排行榜。积分当月有效月底清零。行为产生的时候需要保存一条积分明细到数据库 因此必须采用异步方式,将原有业务与积分业务解耦。如果有必要,甚至可以将积分业务抽离,作为独立微服务。
编写监听器类监听积分的获取,积分的获取有不同方式,不同方式每人每日获取的积分数量是有上限的,判断是否超过每日上限,先查询今天获取多少积分,如果积分超出每日上限,不做操作,结束程序;如果积分不足每日上限, 并且加上本次会超过上限,只保存欠额部分
4.查询积分
需要的数据:积分类型描述,今日已获取积分值, 积分上限
根据积分的不同种类分组统计今天获得的积分,查询即可。
表的设计如下:
字段 类型 约束 备注
id bigint 主键 积分记录表id
user_id bigint 非空 用户id
type tinyint 非空 积分方式:1-课程学习,2-每日签到,3-课程问答,4-课程笔记,5-课程评价
points tinyint 非空 积分值
create_time datetime 非空 创建时间
总结
签到和积分系统通过激励用户参与和增加用户粘性,为应用带来了更多的用户活跃度和留存率。它们在设计和实现时需要考虑数据存储、系统性能、安全性和用户体验等多方面的因素,以确保系统的稳定运行和用户的良好体验。通过合理地设计和优化签到和积分系统,可以有效地提升应用的用户参与度和用户价值,从而为应用的成功运营提供有力支持.