Redis实现Bitmap位图场景

221 阅读3分钟

这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

hello,你好呀,我是灰小猿,一个超会写bug的程序猿,

前两篇文章我和大家讲解了在Redis中的三种特殊数据类型中的前两种Gaospatial地理位置操作和Hyperloglog基数统计的使用,今天我们就接着来和大家分享一下Redis的三种特殊数据类型中的最后一种,Bitmap位图场景的使用,

Bitmap位图场景

在Redis中的Bitmap位图是通过操作二进制位来实现的,在其中存储的数据要么是0,要么是1,比如下面这个{0,1,1,0,0,0,0}。而且位图中的每一个数据都是有唯一的一个下标对应的,和我们学习的数组类似。

那么位图有哪些使用场景呢?

比如我们想要统计CSDN用户是否活跃,假设CSDN有一亿用户,那么我们就将这一亿个用户的状态都表示为0,如果用户登录就表示活跃,那么我们就将该用户对应的数据置为1,但其实在Redis中一亿个0或者1的数据量是非常小的。

或者说用户登录,如果登录就用1表示,未登录就用0表示;公司打卡,打卡就用1表示,当天未打卡就用0表示。

我们以一周打卡的例子来讲解Bitmap位图的使用,

输入位图数据集

在Redis中给一个Bitmap输入数据的命令是SETBIT,格式如下:

SETBIT key offset value

  • key为该数据集的索引
  • offset为要输入的数据的下标
  • value为要输入的数据,0或1

如我们输入某个员工一周的打卡记录,数据集的索引是“mybit1”,注意数据集的下标是从0开始的。

127.0.0.1:6379> SETBIT mybit1 0 0    #下标为0表示第一天
(integer) 0
127.0.0.1:6379> SETBIT mybit1 1 1    #下标为1表示第二天
(integer) 0
127.0.0.1:6379> SETBIT mybit1 2 0    #下标为2表示第三天
(integer) 0
127.0.0.1:6379> SETBIT mybit1 3 0
(integer) 0
127.0.0.1:6379> SETBIT mybit1 4 1
(integer) 0
127.0.0.1:6379> SETBIT mybit1 5 1
(integer) 0
127.0.0.1:6379> SETBIT mybit1 6 0
(integer) 0

统计“1”的个数

如果我们想知道整个数据集中1的个数,也就是例子中打卡的天数,那么可以使用BITCOUNT命令,格式如下:

BITCOUNT key [start end]

  • key表示位图数据集的索引
  • [start end]表示开始和结束的下标,默认不写就是统计数据集中所有数据

如我们要查询该用户这一周打卡的天数,

127.0.0.1:6379> BITCOUNT mybit1
(integer) 3

注意啦,我们上面实验的这些数据现在虽然都是一个命令一个命令的输入的,但是在开发中这些都是可以通过Java类和方法批量写入的!

今日总结

这几天学习内容主要就是Redis中的三种特殊数据类型Gaospatial地理位置、Hyperloglog基数统计、Bitmap位图场景。 这三种的基本命令使用都是需要了解知道的,虽然说他们的使用可能没有String类型那么多,但是在特殊场景下,它们的使用效率绝对比String类型高得多。

所以掌握Redis中三种特殊数据类型的使用也是非常重要的!下一篇我们来讲解在Redis中如何实现事务操作。

我是灰小猿,我们下期见!