一、为什么要做签到功能
培养用户使用习惯,签到功能设置的目的在于吸引用户每天去完成签到动作,培养用户使用习惯。
增加用户活跃度,对于企业来说,用户养成长期的签到习惯,使得用户活跃度更强,刺激沉默用户,使得其在活跃过程中驻足产品。促进活跃用户更加活跃,产生正向反馈。
提高企业一定的收入,签到后用户获取的奖励,一定程度上能提高企业的收入,优惠券或积分的形式可以促使用户下单,提高订单量。
二、数据表设计
签到最核心的包含两个要素:
• 谁签到:用户id
• 什么时候签的:签到日期
同时需要再考虑一些功能要素,比如:
• 补签功能,所以要有补签标示
• 按照年、月统计的功能:所以签到日期可以按照年、月、日分离保存
最后表结构设计如下
签到表
字段名 | 说明 |
id | 主键 |
user_id | 用户id |
year | 签到年份 |
month | 签到月份 |
date | 签到日期 |
is_backup | 是否补签 |
Bitmap
这种设计会有些浪费空间如果每天活跃的用户很多,那么占用的存储空间会很大
如果要节省存储空间,我们可以使用Bitmap,它会像下图这样
它把每个bit位对应当月的每一天,形成映射关系,用0和1分别标识是否打卡,这种思路称为bitmap(位图)而我们的Redis中恰好提供了bitmap的数据结构(属于是字符串的一种,在String下的一类)和相关指令操作,我们可以直接使用。
在Redis中,bitmap底层还是基于String类型实现的,存储数据是以二进制(bit位)为单位进行存储的,bitmap在处理大量数据统计和判断时,可以只占用非常小的一部分内存,并且计算速度非常高效
三、流程图
四、功能需求
查询签到:
在签到日历中,我们可以把用户本月第一天到今天为止签到过的日期高亮显示。
因此我们必须把签到记录返回,具体来说就是每一天是否签到的数据。是否签到,就是0或1,刚好在前端0和1代表false和true,也就是签到或没签到。
因此,每一天的签到结果就是一个0或1的数字,我们最终返回的结果可以是一个0或1组成的数组,对应从本月第1天到今天为止每一天的签到情况。
新增签到:
在个人中心的页面,用户每天都可以签到一次。在用户点击签到之后,后台会组装签到记录,保存到redis的bitmap
那么在后台,要做的事情就是把BitMap中的与签到日期对应的bit位设置为1,并计算连续签到天数
另外,为了便于统计,我们可以每个月为每个用户生成一个独立的KEY,因此KEY中必须包含用户信息、月份信息,类似于下图: