Bitmap实现签到功能

bitmap实现签到功能🚩

用BitMap实现亿级数据统计:

  • 常见场景:二值状态统计

    • 给一个 userId ,判断用户登陆状态;
    • 显示用户某个月的签到次数和首次签到时间;
    • 两亿用户最近 7 天的签到情况,统计 7 天内连续签到的用户总数
  • Bitmap 的底层数据结构用的是 String 类型的 SDS 数据结构来保存位数组,Redis 把每个字节数组的 8 个 bit 位利用起来,每个 bit 位 表示一个元素的二值状态(不是 0 就是 1)。

  • 判断用户登陆状态:SETBIT <key> <offset> <value> GETBIT <key> <offset>

    判断 ID = 10086 的用户的登陆情况:

    1. 表示用户已登录:SETBIT login_status 10086 1

    2. 检查该用户是否登陆:GETBIT login_status 10086

    3. 登出:SETBIT login_status 10086 0

  • 用户每个月的签到情况:

    用户在 2021 年 5 月 16 号打卡:

    1. 用户在 2021 年 5 月 16 号打卡:SETBIT uid:sign:89757:202105 15 1
    2. 判断编号 89757 用户在 2021 年 5 月 16 号是否打卡:GETBIT uid:sign:89757:202105 15
    3. 统计该用户在 5 月份的打卡次数:BITCOUNT uid:sign:89757:202105
  • 连续签到用户总数:

    在记录了一个亿的用户连续 7 天的打卡数据,如何统计出这连续 7 天连续打卡用户总数呢?

    把每天的日期作为Bitmap的 key,userId 作为 offset,若是打卡则将 offset 位置的 bit 设置成 1。

    一共有 7 个这样的 Bitmap,如果我们能对这 7 个 Bitmap 的对应的 bit 位做 『与』运算。

    同样的 UserID offset 都是一样的,当一个 userID 在 7 个 Bitmap 对应对应的 offset 位置的 bit = 1 就说明该用户 7 天连续打卡。

    结果保存到一个新 Bitmap 中,我们再通过 BITCOUNT 统计 bit = 1 的个数便得到了连续打卡 7 天的用户总数了。

  • 统计单个用户的连续签到天数:

    • 查到bitmap里的所有记录:BITFIELD sign:5:202203 GET u14 0(无符号14个数据,从0开始)

    • 循环遍历这个数和1与运算,为0则未签到,结束,为1则签到了,计数器加一。

    • 最后再右移一位。

      int count = 0;
      while(true){
          if(num & 1 == 0){
              break;
          }else{
              count++;
          }
          num >>>= 1;
      }
      

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在简历中介绍使用Redis中的bitmap结构实现签到功能时,可以按照以下步骤进行: 1. 简单介绍RedisBitmap:首先简单介绍Redis是一个内存数据存储系统,而BitmapRedis提供的一种数据类型,它可以用于存储一系列的二进制标记,非常适合于需要高效处理二进制标记的场景。 2. 说明签到功能需求:接下来简要说明签到功能的需求,例如需要记录用户在某个时间点是否签到,以及需要对签到情况进行统计和分析等。 3. 介绍Bitmap实现签到的方法:接着详细介绍如何使用Redis中的Bitmap结构来实现签到功能,包括创建Bitmap、更新用户签到状态、查询用户签到状态、统计签到人数等步骤,以及如何利用Bitmap进行高效的位运算和统计计算。 4. 突出技术优势和实现效果:在介绍的过程中可以突出Redis中的Bitmap结构相对于其他存储方式的优势,比如空间占用少、查询速度快等,并可以列举一些实际的实现效果,比如能够支持海量用户的高并发访问、能够满足秒级响应要求等。 5. 强调自己的经验和贡献:最后可以适当强调自己在该项目中的经验和贡献,例如设计并实现了高效的签到功能,优化了性能,提高了用户体验等。 一个简短的例子: 使用Redis中的bitmap结构,实现了一个高效的签到功能。通过创建一个bitmap,每个用户对应bitmap中的一位,当用户签到时,将该位设为1,查询用户是否签到时,只需要查询该位是否为1,可以快速完成操作。在统计签到人数时,只需要对整个bitmap进行位运算即可。该方法占用空间较小,查询速度较快,能够支持海量用户的高并发访问,同时也满足秒级响应要求。我在该项目中设计并实现了高效的签到功能,并优化了性能,提高了用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guanam_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值