写在前面
Bitmap并非一种独立的数据结构,而是基于String提供的功能,可用于如二值状态的场景中,基于bit的0|1
来存储状态,如下图:
本文就一起来看下!
1:setbit
该命令用来将指定的比特位设置为1|0
,命令格式SETBIT key offset value
,这里offset从0开始,如下操作:
127.0.0.1:6379> setbit well 2 1
(integer) 0
127.0.0.1:6379> setbit well 6 1
(integer) 0
127.0.0.1:6379> setbit well 7 1
(integer) 0
然后我们通过getbit命令获取对应比特位的值,如果是1则返回整数1,如果是0则返回整数0,如下:
127.0.0.1:6379> getbit well 0
(integer) 0
127.0.0.1:6379> getbit well 1
(integer) 0
127.0.0.1:6379> getbit well 2
(integer) 1
127.0.0.1:6379> getbit well 3
(integer) 0
127.0.0.1:6379> getbit well 4
(integer) 0
127.0.0.1:6379> getbit well 5
(integer) 0
127.0.0.1:6379> getbit well 6
(integer) 1
127.0.0.1:6379> getbit well 7
(integer) 1
这里我们设置的其实就是#
,因为其ASCII码就是二进制的00100011
,如下图:
也可以通过如下方式验证:
int xx = '#';
// 35
System.out.println(xx);
如果是没有显式设置的比特位默认为0,知道了这个和ASCII的对应关系后我们就可以利用其来设置默认比特位为1的位图了,如\xff
对应的ASCII码就是11111111
,因此我们就可以用其来设置初始化全部为1的bitmap,如下设置2个字节长度的bitmap:
127.0.0.1:6379> set allbit1 "\xff\xff"
OK
127.0.0.1:6379> bitcount allbit1 0 -1
(integer) 16
其中bitcount allbit1 0 -1
是统计所有比特位中值为1的个数,这里结果是16,所以我们就设置成功了。我们也可以通过bitop 命令来设置所有的比特位为1,如下测试:
127.0.0.1:6379> setbit bitopt:to:1 7 0
(integer) 0
127.0.0.1:6379> bitop not bitopt:all:1 bitopt:to:1
(integer) 1
127.0.0.1:6379> bitcount bitopt:all:1 0 7
(integer) 8
2:getbit
获取指定比特位的值,0的话返回整数0,1的话返回整数1,超过比特位长度返回0,如下测试:
127.0.0.1:6379> bitcount allbit1 0 -1
(integer) 16
127.0.0.1:6379> setbit testgetbit 0 1
(integer) 0
127.0.0.1:6379> setbit testgetbit 3 1
(integer) 0
127.0.0.1:6379> setbit testgetbit 4 1
(integer) 0
127.0.0.1:6379> getbit testgetbit 0
(integer) 1
127.0.0.1:6379> getbit testgetbit 1
(integer) 0
127.0.0.1:6379> getbit testgetbit 2
(integer) 0
127.0.0.1:6379> getbit testgetbit 3
(integer) 1
127.0.0.1:6379> getbit testgetbit 4
(integer) 1
127.0.0.1:6379> getbit testgetbit 5
(integer) 0
3:bitcount
返回指定范围内比特位为1的个数,格式BITCOUNT key [start end]
,其中start和end代表第几个字节
而非比特位,整数就是以0为下标从前往后数,也可以为负数,就是从后往前数,-1代表最后一个字节,-2代表倒数第二个字节,以此类推,如下测试:
127.0.0.1:6379> setbit testbitcount 1 1
(integer) 0
127.0.0.1:6379> setbit testbitcount 3 1
(integer) 0
127.0.0.1:6379> bitcount testbitcount 0 -1
(integer) 2
4:bitpos
从指定范围(字节)内获取第一个为0或1的比特位的偏移量,格式BITPOS key bit [start [end]]
,如下测试获取0到1字节中第一个为1的比特位的偏移量:
127.0.0.1:6379> setbit testbitpos 8 1
(integer) 0
127.0.0.1:6379> bitpos testbitpos 1 0 1
(integer) 8
如果没有符合要求的比特位则返回-1,如下测试:
127.0.0.1:6379> set mykey "\xff\xff\xff"
OK
127.0.0.1:6379> bitpos mykey 0 0 -1
(integer) -1
5:bitop
对多个字符串进行与或非的运算,格式BITOP [AND|OR|NOT|XOR] destkey srckey1 srckey2 srckey3 ... srckeyN
,如下测试:
127.0.0.1:6379> set key1 "\xff"
OK
127.0.0.1:6379> set key2 "\x00"
OK
# 逻辑与
127.0.0.1:6379> bitop AND andkey key1 key2
(integer) 1
127.0.0.1:6379> get andkey
"\x00"
# 逻辑或
127.0.0.1:6379> bitop OR orkey key1 key2
(integer) 1
127.0.0.1:6379> get orkey
"\xff"
# 异或
127.0.0.1:6379> bitop XOR xorkey key1 key2
(integer) 1
127.0.0.1:6379> get xorkey
"\xff"
# 逻辑非
127.0.0.1:6379> bitop not notkey key1
(integer) 1
127.0.0.1:6379> get notkey
"\x00"
写在后面
参考文章列表:
ASCII 表 。