1.前言
本篇博客将以演示Bitmaps的常用命令的方式,带各位读者一起学习Redis6新数据类型Bitmaps。如果文章有不合理或者错误的地方,欢迎各位读者朋友在评论区提出,感谢大家的阅读。
2.关于Bitmaps
现代计算机用二进制(位) 作为信息的基础单位, 1个字节等于8位, 例如“abc”字符串是由3个字节组成, 但实际在计算机存储时将其用二进制表示, “abc”分别对应的ASCII码分别是97、 98、 99, 对应的二进制分别是01100001、 01100010和01100011,如下图
合理地使用操作位能够有效地提高内存使用率和开发效率,Redis提供了Bitmaps这个“数据类型”可以实现对位的操作。
(1)Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作。
(2)Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。
在一些特定的业务场景中还是非常的适用,上面的介绍或许过于晦涩,可以把它想象成一个特殊的Zset集合
3.常用命令
1. setbit {key} {offset} {value}
使用 setbit <key> <offset> <value> 命令
向指定的数组 key 中 偏移量 offset 的位置存储 一个值 value (value 只能是 0 或 1)
如果指定的数组 key 不存在则创建一个对应的数组 将值存储进去
2. getbit {key} {offset}
使用 getbit <key> <offset> 命令
返回 对应数组 key 偏移量 offset 存储的数据
注意 这个“单位数组中”如果某个偏移量没有改动过 默认存储的就是 0
如果没有这个key 返回的也是 0
业务场景
为防止上面内容晦涩,小编决定举办一个业务场景,以业务场景演示的方式来带大家熟悉 Bitmaps
假设现在要记录 用户 访问 网站 要记录该用户是否访问过该网站 我们将以用户id作为偏移量 offset
以 0 和 1 记录用户是否访问过 如果访问过 则标记为 1 如果没有访问过 则标记为 0 (值得注意的是在这个“单位数组中”如果某个偏移量没有改动过 默认就是 0 ) 也就是说在这个业务场景中所有用户都没有对这个网站进行访问,数据都是纯净的。
假设 用户 id 为 16 的用户访问了我们特定的站点
则我们执行 setbit user 16 1
查看用户id为 19 的用户是否访问过该站点
则执行 getbit user 19
注意
在第一次初始化Bitmaps时, 假如偏移量非常大, 那么整个初始化过程执行会比较慢, 可能会造成Redis的阻塞。
3. bitcount {key} [start end]
使用命令 bitcount <key> [start end] 命令
返回对应数组 key 中 start下标 到 end下标 字节组中 值为 1 的数量
如果直接执行 bitcount <key> 则返回其中 值为 1 的数量
在上面的业务场景中查询网站的总访问人数则执行 bitcount userr
注意 下标位置从 0 开始
举例
假设一个字节数组为 01000001 01000000 00000000 00100001 对应的下标位置为 0 1 2 3
假设执行 bitcount K1 1 2
统计下标1、2字节组中bit=1的个数 则是 01000000 00000000 其中只有一个 1
则返回 1
假设执行 bitcount K1 1 3
统计下标1、3字节组中bit=1的个数 即01000000 00000000 00100001 其中有3个1
则返回 3
假设执行 bitcount K1 0 -2
统计下标0到下标倒数第2,字节组中bit=1的个数 则 即01000001 01000000 00000000
返回 3
注意
上面使用的 sebit 设置的是bit位置,而bitcount计算的是byte位置
4. bitop and(or/not/xor) {destkey} [key…]
bitop是一个复合操作它可以做多个Bitmaps的and(交集)or(并集)not(非)xor(异或)操作并将结果保存在destkey中
4.结尾
关于Redis中Bitmaps的内容就演示到这里吧,文章有不合理或者错误的地方各位读者朋友可以在评论区提出来,后续专栏将更新更多优质内容,期待的小伙伴可以点个关注。