签到实现

签到实现

MySQL

传统版本

  • 表设计
字段 说明
id 主键
user_id 用户ID
created_at 签到日期
continuous_count 连续签到天数
  • 业务处理

    • 每次签到插入一条新数据
    • 计算连续签到天数
    • 如果非连续签到,连续签到天数为0

按位存储

  • 表设计
字段 说明
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的数量,即签到天数

参考

签到实现