为了激励学员,我们设计了一个学习积分系统,学员在网站上的很多操作都可以获得积分,像看视频、发评论、签到等等
而积分又可以去参与排行榜、兑换优惠券等等,这样就可以提高学习的学习热情,增加网站访问量
而且像积分、排行榜等功能在很多项目中都存在,因此这套方案适用性很广,可以给大家以后实现相关功能提供思路
1.签到的数据表是怎么设计的?
签到最重要的就是两个因素:
- 谁签到:用户id
- 什么时候签到:签到日期
同时要考虑一些功能因素,比如:
补签功能,所以要有补签标识
按照年、月统计的功能:所以签到的日期可以按照年、月、日分离存储
2.签到的时候为什么要用redis的bitmap及怎么设计的key和value?
bitmap是redis的一种存储类型底层是基于String类型实现的,存储数据以二进制(bit位)为单位进行存储的,它的每一个bit位对应当的每一天,我们可以设置他的每一位,用0表示未签到1表示已签到,这样我们就可以把一个人在某一个月份的签到情况用一条记录去表示,十分节省空间。
因为签到最重要的就是 签到人和签到日期,为了便于统计,我们计划每个月为每个用户生成一个独立的KEY, 所以KEY我们设计的是以 用户id:年月 来唯一表示一个记录,value就是一个二进制字符串用来存储当前月的签到情况。
3.积分的规则?
4.如果判断连续签到?
5.积分结算怎么设计的?
用户签到、学习、参与互动问答、提交学习笔记等行为都可以产生积分,并基于积分形成排行榜。积分当月有效,月底清零。
由积分规则可知,获取积分的行为多种多样,而且每一种行为都有自己的独立业务。而这些行为产生的时候需要保存一条积分明细到数据库。
我们显然不能要求其它业务的开发者在开发时帮我们新增一条积分记录,这样会导致原有业务与积分业务耦合。
因此必须采用异步方式,将原有业务与积分业务解耦。如果有必要,甚至可以将积分业务抽离,作为独立微服务。
6.如何实现?
新增积分:签到或者学习等数据新增时,将消息发送到MQ中,然后在积分服务中设置对应的监听器,不同的监听器调用的是同一个新增积分方法。这个方法需要根据传来的业务类型,来进行不同的积分新增逻辑判断,然后新增积分。
查询积分:就是调用积分服务根据前端需要返回的数据,去积分表进行查询即可。