文章目录

  • 问题
  • Redis的Bitmap
  • MySQL实现
  • 特殊实现思路


问题

这个问题是我再面试阿里的时候遇到的,他问的是:
如果我现在有一个需求,就是我要做一个用户的签到系统,这个签到系统要求做到能为系统业务提供不同签到天数服务的功能,比如我要签到7天,14天,30天等等,我都能直接用这个服务来完成,你能和我说说你的思路嘛?

这道题我是给了三种方案。

Redis的Bitmap

对于签到的场景,我们可以使用bitmap来完成,我们知道bitmap是Redis提供的一种基于二进制位的一种数据结构,我们可以通过设定每一个二进制位为1,来代表当天用户已经签到了,如果没有签到那么不设定,默认为0即可。

MySQL实现

这种实现方式和第一种差不多,我说的是直接存储一个30位的varchar类型,然后如果用户登录了,就把这个对应位置设定为1。

特殊实现思路

我说,如果说要做一个连续签到判定的功能的话,我是这样子想的:
我们可以设定一个字段叫做 last-signed-date,也就是上一次签到的日期,以及一个bit类型的state位,用来判断是否进行了连续签到。
假设我们从周一开始进行签到判断,每周日来判断是否连续签到了一周,那么我们可以如此,在第一天进行签到的时候,我们设定state=1,然后last-signed-date就设定为签到的那一天日期,然后如果第二天没有签到,那么last-signed-date不变,打算state=0,之后即使第三天签到了,state也依旧为0,这样子我们就能知道是否连续签到了一周或者一个月,当然,这样子做的话可能就不太方便展示那天签到那天没签到了,还是需要类似于二进制位的方式来保存是否签到了。

不过,面试官刚刚好就是对这第三种方式最满意。