利用redis + bitmap解决统计数据相关问题(也变相解决了大数据量内存占用问题)

一、应用场景:

用户签到 / 统计活跃用户 / 用户在线状态

1、网站的签到功能(这里不考虑具体数据,只是统计数据),并且需要展示最近一个月,甚至两个月的签到情况,如果使用bitmap我们怎么做?

指令 SETBIT key offset value
        BITCOUNT key [start] [end]
        BITOP operation destkey key [key ...]
思路:
        首先,先定义key为当日时间字符串,offset为用户id,value定义签到为1,否则为0。
使用SETBIT存储好数据后,使用BITCOUNT查询指定时间内数据量。
如果需要统计,近三天都签到过的用户,可以使用BITOP命令,进行“and”运算。

2、很多公司会进行用户信息统计,当统计活跃用户时,可能数据量非常大,又比较繁琐,如果使用bitmap我们怎么做?

指令 SETBIT key offset value
      BITCOUNT key [start] [end]
      BITOP operation destkey key [key ...]
思路:
    首先,先定义key为当日时间字符串,offset为用户id,value定义当日活跃为1,否则为0。
使用SETBIT存储好数据后,使用BITCOUNT查询指定时间内数据量。
如果需要统计,近三天都活跃过的用户,可以使用BITOP命令,进行“and”运算。

3、用户在线状态统计,这个最简单了,和上面两种情况类似,如果使用bitmap我们怎么做?

指令 SETBIT key offset value
GETBIT key offset
思路:
    首先,先定义key为当日时间字符串,offset为用户id,value定义当日在线为1,否则为0。
使用SETBIT存储好数据后,使用GETBIT查询指定用户是否在线。
个人认为不需要进行统计,如果需要统计,方法和上述两种方法类似。


二、.Bitmap相关命令

1)

命令:SETBIT key offset value

时间复杂度:O(1)

命令描述:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。当 key 不存在时,自动生成一个新的字符串值。字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。

返回值:指定偏移量原来储存的位。

(2

命令:GETBIT key offset

时间复杂度:O(1)

命令描述:对 key 所储存的字符串值,获取指定偏移量上的位(bit)。当 offset 比字符串值的长度大,或者 key 不存在时,返回 0 。

返回值:字符串值指定偏移量上的位(bit)。

(3

命令:BITCOUNT key [start] [end]

时间复杂度:O(N)

命令描述:计算给定字符串中,被设置为 1 的比特位的数量。一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。

返回值:被设置为 1 的位的数量。

(4

命令:BITOP operation destkey key [key ...]

时间复杂度:O(N)

命令描述:对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。

operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:

  • BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
  • BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
  • BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
  • BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey 。

除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。

处理不同长度的字符串当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0 。空的 key 也被看作是包含 0 的字符串序列。

当处理大型矩阵(matrix)或者进行大数据量的统计时,最好将任务指派到附属节点(slave)进行,避免阻塞主节点。

返回值:保存到 destkey 的字符串的长度,和输入 key 中最长的字符串长度相等。





猜你喜欢

转载自blog.csdn.net/u012888052/article/details/80380143