如何使用redis bitmap计算签到数和日活数

什么是BitMap

BitMap,即位图,其实也就是 byte 数组,用二进制表示,只有 0 和 1 两个数字。
在这里插入图片描述

大小

首先占多少大小是根据里面bit偏移量而来。

那么有个小问题,一个bitmap能存多少位。 实际上, redis只支持5种数据类型. 并没有bitmap. 也就是bitmap是基于redis的字符串类型的. 而一个字符串类型最多存储512M.

8 bit = 1byte

1024 byte = 1kb

1024 kb = 1Mb

8bit = 1b(字节) = 0.001kb

其次:

我们使用的bitmap指令SETBIT key offset value, 这个指令就是将第offset设置成0或1. 比如 SETBIT ss 1000 1 //就是将1000位置为1. 1 bit就是1位, 所以我们只要将512M换算成bit, 那么就知道bitmap支持的最大设置长度了. 计算如下

 8 * 1024 * 1024 * 512  =  2^32

统计日活数

原始写法

以时间建立一个key set类型,也就是说每天一个key。把每天登录的userId放到里面。如果取连续活跃用户或者计算留存。就取出来就行交并集。

缺点:set 一位就是2byte,而1024位bitmap才1024/8 =128byte可见占用大小。

优化

所以我们可以这么写,使用bitmap。key还是每天的日期。以userid作为偏移量。

涉及到的语法。

  1. 添加
RBitSet appidBitSet = redissonClient.getBitSet("key");
appidBitSet.set(serialNum);
  1. 删除
RBitSet bitSet = redissonClient.getBitSet("key");
bitSet.delete();
  1. 求bitmap中为1的和
RBitSet bitSet = redissonClient.getBitSet("key");
long cardinality = bitSet.cardinality();
  1. 交集
RBitSet bitSetFirst = redissonClient.getBitSet("k1");
RBitSet bitSetTarget = redissonClient.getBitSet("k2");
BitSet bitSetAnd = bitSetFirst.asBitSet();
bitSetAnd.and(bitSetTarget.asBitSet());
int cardinality = bitSetAnd.cardinality();

统计签到数

原写法

查库,写sql。计算本月一共签到了多少天,连签多少天。

优化

一个用户每月一个key(month+userId),根据月内的天数偏移量设为1。比如这个月第五天,那就第五位变成1。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值