前面我们学习 Redis 中的5中基础数据类型,今天我又来了,没错,就是 Redis 中剩余的3中高级数据类型,废话不多说,我们开始吧。
Bitmap
Bitmap 翻译过来就是位图,那它有什么作用呢?
我们首先想这么一个场景,二值状态统计,这个二值状态就是指集合元素的取值就只有0和1两种。比如:在签到打卡的场景中,我们只用记录签到(1)或未签到(0),这就是典型的二值状态。在我们签到统计时,每个用户的一天的签到用1个bit位就能表示,有多少天就只需要多少个bit位,不需要使用太复杂的集合类型,这时我们就可以使用 Bitmap。
那 Bitmap 的实现原理又是啥?
Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。String 类型是会保存为二进制的字节数组,所以,Redis 就把字节数组的每个 bit 位利用起来,用来表示一个元素的二值状态,可以把 Bitmap 看作是一个 bit 数组。
Bitmap 提供了 GETBIT/SETBIT 操作,使用一个偏移值 offset 对 bit 数据的某一个 bit 位进行读和写,这个偏移值 offset 是从 0 开始的,最小就是0。当使用 SETBIT 对一个 bit 位进行写操作时,这个 bit 位会被设置为1。Bitmap 还提供了BITCOUNT 操作,用来统计这个 bit 数组中所有“1” 的个数。
那么该怎么具体使用 Bitmap 进行签到统计呢?
假设我们要统计 ID 3000 的用户在 2020 年 8 月份的签到情况,就可以按照下面的步骤进行操作。
1)执行下面的命令,记录该用户 8 月 3 号已签到。
SETBIT uid:sign:3000:202008 2 1
2)检查该用户 8 月 3 日是否签到。
GETBIT uid:sign:3000:202008 2
3)统计该用户在 8 月份的签到次数。
BITCOUNT uid:sign:3000:202008
这样,我们就知道该用户在 8 月份的签到情况了,是不是很简单呢