签到实现
MySQL
传统版本
- 表设计
字段 | 说明 |
---|---|
id | 主键 |
user_id | 用户ID |
created_at | 签到日期 |
continuous_count | 连续签到天数 |
按位存储
- 表设计
字段 | 说明 |
---|---|
key_id | 签到月份+用户ID作为主键 |
user_id | 用户ID |
sign_month | 签到月份 |
sign_record | 签到记录 |
sign_count | 连续签到天数 |
last_sign_date | 上次签到日期 |
- 业务处理
- 一个用户一个月一条记录,一年12条记录
- 根据需要可查询当月,上月,或者连续几个月连续签到天数
- 当月第一次签到插入一条新数据,之后则更新sign_record字段,记录当天是否已签到(位存储)
- sign_record = sign_record | (1 << x),签到的天数对应的位是1,反之为0
- 1 << x 表示:1向左移动x位
Redis的Bitmaps实现
- 设定用户key
sign:userID
- 对应的value为签到天数,通过bitmaps记录
- 确定第0为的时间节点,然后计算出当天距离第0为的时间节点差值,比如0为2000年1月1日,在2000年1月3日签到,差值为2,则将此天数签到记录在第2位
setbit sign:user_key 2 1
- 查询用户签到数据
127.0.0.1:6379> get sign:user_key
- 查询用户某天是否签到,计算出指定日期和0位时间点的差值X,
127.0.0.1:6379> get sign:user_key x
- 通过
bitcount
获取范围内的1的数量,即签到天数