• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后我们通过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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这里我们设置的其实就是#,因为其ASCII码就是二进制的00100011,如下图:

    在这里插入图片描述

    也可以通过如下方式验证:

    int xx = '#';
    // 35
    System.out.println(xx);
    
    • 1
    • 2
    • 3

    如果是没有显式设置的比特位默认为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
    
    • 1
    • 2
    • 3
    • 4

    其中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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    • 2
    • 3
    • 4

    如果没有符合要求的比特位则返回-1,如下测试:

    127.0.0.1:6379> set mykey "\xff\xff\xff"
    OK
    127.0.0.1:6379> bitpos mykey 0 0 -1
    (integer) -1
    
    • 1
    • 2
    • 3
    • 4

    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    写在后面

    参考文章列表:

    Redis Bitmap 学习和使用

    ASCII 表

  • 相关阅读:
    数据增强
    java项目——CRM客户管理系统(SpringBoot+MyBatis)
    Rust Wasm 图片转 ASCII 艺术
    板刷codeforces 1000分
    373. 查找和最小的 K 对数字-暴力解法和多路归并思想+败者树+大顶堆算法(高阶算法)
    C#_预处理指令
    01-Docker部署MongoDB
    Spring(六)- BeanFactoryPostProcessor 与 BeanPostProcessor 后处理器
    STM32串口printf通过DMA打印(含实测代码)
    paddlespeech 安装和测试教程
  • 原文地址:https://blog.csdn.net/wang0907/article/details/127637042