大家有没有想过如何统计活跃用户数量?如果是自己做,那该怎么做?
这里思考一分钟,后面我将分享一下如何使用 redis 中的位图来统计活跃用户数。
位图(bitmap)是二进制的 byte 数组 ,也可以简单理解成是一个普通字符串。它将二进制数据存储在 byte 数组中以达到存储数据的作用。
图 1.1
在解释什么是位图的时候说过,位图可以理解成是一个普通字符串, 那么我们为什么要用位图而不是字符串呢 ?
下面是在 redis 中存储字符串的一个示意图
图 2.1
如图,存储字符串是将字符串二进制数组的形式存储在 redis 中,位图可以直接对 二进制的数组操作, 位图的优势在于可以用 0 和 1来存储布尔值,这大大降低了我们的存储空间消耗 。由于这个特性,我们 用位图来记录签到信息,记录活跃用户等 ,可以达到节省空间的能力(后面会有介绍)。
那我们如何对二进制的数组进行操作呢?
上文说的二进制数组我们可以对它做 添加、查找及修改 的功能
setbit [keyName] [offset] [value]
offset:偏移量,指的是数组的下标; value: 数据, 只能是 0 和 1。
这条命令既可以添加数据也可以修改数据。
getbit [keyName] [offset]
offset:偏移量,指的是数组的下标。这里,除了设置 value 为 1 的 offset, 查询其他的都返回 0
图 2.2
请对照上图,我们一起完成下面的探究:
上面介绍了位图的基本概念和使用,通过一系列的探究希望能帮助大家更好的理解位图
那么,如何将位图应用的项目中呢?
bitcount 是用来查找 1 出现的次数,既可以对位图使用也可以对字符串使用 ,用法如下:
bitcount [keyName] [startWith] [endWith]
这里的 startWith 和 endWith 可以理解成是字符串的下标,一个字符串对应 8 位二进制数据;它们相当于是截取字符串,如 s= "hi" , s[0:0] = "h" , 它所对应的二进制数组的下标是 0,7,以此类推。
其实这里不好解释,先来带代码,可以结合着上面的 图 2.2 看一下,大家后面可以在领悟一下
> set str hi
> bitcount str 0 0
(integer) 4
> bitcount str 0 1
(integer) 8
> bitcount str
(integer) 8
应用场景: 统计活跃用户的数量
bitpos 用来查找指定范围内出现的第一个 0 或 1 ,用法如下:
bitpos [keyName] [bit] [start] [end]
bit: 要找的 0 或者 1, start 和 end 同上面的 startWith 和 endWith
应用场景: 获取第一次签到和第一次未签到的时间
上面大致说了 2 个应用场景:
我在这里稍微介绍一下思路,然后附上一个 统计活跃用户的数量 可供参考
Demo: DailyActiveUsers