redis之Bitmap

写在前面

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"

写在后面

参考文章列表:

Redis Bitmap 学习和使用

ASCII 表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值