签到获取积分的设计

一、积分产生的规则:签到

1.1普通签到表字段:用户id、签到日期、补签标按照年月日统计的功能

借助mysql来做签到虽然很简单,但是一条记录就会 占用22个字节

1.2 优化签到表

签到记录也有很多,可以选择更节省空间的方式来进行优化:统计一个用户在一个月内的签到记录

把每一个bit对应为当月的每一天,形成映射关系,"1"为签到,"0"为没签到,这样就可以把一个用户在那个月份的签到记录,放到一条记录里面,大大减少了空间。 这种思路称为bitmap(位图),Redis中刚好又提供了bitmap的数据结构和相关操作指令。在Redis中,bitmap底层还是基于String类型实现的(bitmap属于字符串的一种) ,存储数据是以二进制(bit位)为单位进行存储的bitmap在处理大量数据统计和判断时,可以只占用非常小的一部分内存,并且计算速度非常高效!下面是Redis中bitmap的操作命令:

签到表:

签到最核心的包含两个要素:

• 谁签到:用户id

• 什么时候签的:签到日期

同时要考虑一些功能要素,比如:

• 补签功能,所以要有补签标示

• 按照年、月统计的功能:所以签到日期可以按照年、月、日分离保存

积分表:

根据产品原型可以得到积分表需要记录下列信息:

• 本次得到积分值

• 积分方式

• 获取积分时间

• 获取积分的人

二、查询签到:

所谓的查询签到就是在表里面根据月份查询签到记录,在签到日历中把当前用户的本月第一天到今天的所有签到的日期高亮显示,所以要把所有的签到记录返回,签到是1没签到是0,最终返回一个结果由1和0组成的数组

 实现步骤:

1. Redis中储存 0101(四天的打卡记录 )

2. 执行命令获取本月开始到今天的打卡记录,返回的是十进制 ---->5

3. 十进制需要转成二进制: 5 的二进制----> 101  与redis中储存的不符  需要从最高位(最左边)补“0”,补的个数----> 4 - 当前位数(3) ---->需要补一个0  ---> 0101

三、新增签到

需求分析:

在个人中心的积分页面,用户每天都可以签到一次:

而在后台,要做的事情就是把BitMap中的与签到日期对应的bit位设置为1

另外,为了便于统计,我们计划每个月为每个用户生成一个独立的KEY,因此KEY中必须包含用户信息、月份信息,长这样:

实现流程

1、组装需求的签到记录表并保存

当前日期,key,今天是本月的第几天

2、获取本月签到情况的bitmap,将其反转,获得第一个0出现的位置,如果得不到对象就说明没出现过未签到的情况,当前天数就是连续签到天数,直接返回,这样就得到了连续签到的天数

3、利用switch来判断连续签到的类型,来得到对应的连续签到奖励,保存积分明细

涉及到的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值