位图(也称位数组或位向量)是由比特位(bit)组成的数组,它的底层数据类型是字符串。因为字符串本质是二进制大对象,所以可以将其视作位图。同时位图存储的是Boolean信息,所以在某些大数据的情况下可以节省很多内存空间。

  假如我们在统计用户今日是否登录的情况下,如果有10亿个用户的id数,那么使用位图就会分配10亿个比特,内存占用大约在120MB左右。如果这个存放在集合中,如果使用8个字节的整型来存储用户的ID,那么就需要7GB的内存进程存储。所以使用位图在存储数据量大的情况下还是有很多优势。

  以上的情况都必须建立在位图分布分均匀的情况下,如果有10亿个用户,而使用位图只有100万的用户登录,那么这时候位图就很稀疏,分布不均匀,就会造成Redis服务器阻塞。可能这时候使用集合比位图更加合适。

操作命令

SETBIT、GETBIT、BITCOUNT、BITOP

1、使用SETBIT命令设置相应的比特位

127.0.0.1:6379> SETBIT "bit_1" 10 1 #后面是1表示真,0表示假
(integer) 0
127.0.0.1:6379> SETBIT "bit_1" 100 1
(integer) 0

2、使用GETBIT命令获取的指定偏移处的比特位的值

127.0.0.1:6379> GETBIT "bit_1" 10
(integer) 1
127.0.0.1:6379> GETBIT "bit_1" 1000
(integer) 0

3、使用BITCOUNT命令获取位图中设置为1的比特数

127.0.0.1:6379> BITCOUNT "bit_1"
(integer) 2
127.0.0.1:6379> SETBIT "bit_1" 100 0 #将100位上的设为0
(integer) 1
127.0.0.1:6379> BITCOUNT "bit_1"
(integer) 1

4、使用BITOP命令进行位操作,支持四种操作:AND、OR、XOR和NOT。运算后的结果会存储在一个目标键中。

#准备bit_2位图,设置相应的值,目前bit_1中只有10这个位置上有值
127.0.0.1:6379> SETBIT "bit_2" 3 1
(integer) 0
127.0.0.1:6379> SETBIT "bit_2" 5 1
(integer) 0
127.0.0.1:6379> SETBIT "bit_2" 10 1
(integer) 0
127.0.0.1:6379> BITCOUNT "bit_2"
(integer) 3

#进行AND操作,然后存储到bit_3中
127.0.0.1:6379> BITOP AND "bit_3" "bit_1" "bit_2"
(integer) 13
127.0.0.1:6379> BITCOUNT "bit_3"
(integer) 1
127.0.0.1:6379> GETBIT "bit_3" 10
(integer) 1
127.0.0.1:6379> GETBIT "bit_3" 3
(integer) 0
127.0.0.1:6379> GETBIT "bit_3" 5
(integer) 0

#进行OR操作,存储在bit_4
127.0.0.1:6379> BITOP OR "bit_4" "bit_1" "bit_2"
(integer) 13
127.0.0.1:6379> GETBIT "bit_4" 10
(integer) 1
127.0.0.1:6379> GETBIT "bit_4" 3
(integer) 1
127.0.0.1:6379> GETBIT "bit_4" 5
(integer) 1