为你自己学Redis
  • README
  • 安装
    • macos下安装redis
  • 第1章 构建Redis开发环境
    • 1.1 Redis概述
    • 1.2 了解必要的Docker技能
    • 1.3 安装和配置基于Docker的Redis环境
  • 第2章 实践Redis的基本数据类型
    • 2.1 Redis缓存初体验
    • 2.2 针对字符串的命令
    • 2.3 针对哈希类型变量的命令
    • 2.4 针对列表类型变量的命令
    • 2.5 针对集合的命令
    • 2.6 针对有序集合的命令
  • 第3章 实践Redis的常用命令
    • 3.1 键操作命令
    • 3.2 HyperLogLog相关命令
    • 3.3 lua脚本相关命令
    • 3.4 排序相关命令
  • 第4章 实践Redis服务器和客户端的操作
    • 4.1 Redis服务器管理客户端的命令
    • 4.2 查看Redis服务器的详细信息
    • 4.3 查看并修改服务器的常用配置
    • 4.4 多个客户端连接远端服务器
  • 第5章 Redis数据库操作实战
    • 5.1 切换数据库操作
    • 5.2 Redis事务操作
    • 5.3 地理位置相关操作
    • 5.4 位图数据类型的应用
    • 5.5 慢查询实战分析
  • 第6章 Redis数据持久化操作
    • 6.1 Redis持久化机制概述
    • 6.2 AOF持久化机制实战
    • 6.3 RDB持久化机制实战
    • 6.4 如何选用持久化方式
  • 第7章 搭建Redis集群
    • 7.1 搭建基于主从复制模式的集群
    • 7.2 搭建哨兵模式的集群
    • 7.3 搭建cluster集群
  • 第8章 GO整合MySQL与Redis
    • 8.1 GO通过redigo读写Redis
    • 8.2 Go与各种Redis数据类型
    • 8.3 Redis与MySQL的整合
    • 8.4 Redis缓存实战分析
  • 第9章 Redis应用场景与案例实现
    • 9.1 Redis消息队列实战
    • 9.2 Go实战Redis分布式锁
Powered by GitBook
On this page
  • 5.4.1 SETBIT和GETBIT操作
  • 5.4.2 用BITOP对位图进行运算
  • 5.4.3 BITCOUNT操作
  1. 第5章 Redis数据库操作实战

5.4 位图数据类型的应用

在Redis里,位图(Bitmap)是由一串二进制数字组成的,它不是一种数据类型,而是基于字符串、能面向字节操作的对象.位图的长度不固定,但是在计算机里8位(bit)能组成一个字节(Byte),所以位图的长度一般是8或者是8的倍数

5.4.1 SETBIT和GETBIT操作

  • SETBIT

    • 语法:SETBIT key offset value.其中:

      • offset:偏移量(偏移量从左到右计算)

      • value:待设置的值

    • 功能:设置指定键的位图数据

  • GETBIT

    • 语法:GETBIT key offset

    • 功能:读取位图指定位数据.若指定位不存在则返回0

例:

设置位图:

127.0.0.1:6379> SETBIT myBitmap 0 1
(integer) 0
127.0.0.1:6379> SETBIT myBitmap 1 1
(integer) 0
127.0.0.1:6379> SETBIT myBitmap 2 0
(integer) 0
127.0.0.1:6379> SETBIT myBitmap 3 0
(integer) 0
127.0.0.1:6379> SETBIT myBitmap 5 1
(integer) 0

注意:设置位图数据时只能将值设置为0或1:

127.0.0.1:6379> SETBIT myBitmap 7 3
(error) ERR bit is not an integer or out of range

读取位图:

127.0.0.1:6379> GETBIT myBitmap 1
(integer) 1
127.0.0.1:6379> GETBIT myBitmap 3
(integer) 0

读取一个不存在的位:

127.0.0.1:6379> GETBIT myBitmap 7
(integer) 0

5.4.2 用BITOP对位图进行运算

  • BITOP

    • 语法:BITOP operation destkey key [key ...].其中:

      • operation:操作符.

        • AND:按位与

        • OR:按位或

        • XOR:按位异或(如果两个比较的位相同,则结果为0;如果两个比较的位不同,则结果为1)

        • NOT:按位取反

      • destkey:用于保存运算结果的key名

    • 功能:操作位图

例:

创建2个位图:

127.0.0.1:6379> SETBIT bit1 0 1
(integer) 0
127.0.0.1:6379> SETBIT bit1 1 1
(integer) 0
127.0.0.1:6379> SETBIT bit1 3 1
(integer) 0
127.0.0.1:6379> SETBIT bit2 2 1
(integer) 0

即:

  • bit1:1011

  • bit2:0100

按位与操作:

注:按位与操作的结果应为0000

127.0.0.1:6379> BITOP AND result bit1 bit2
(integer) 1

查看结果:

127.0.0.1:6379> GETBIT result 0
(integer) 0
127.0.0.1:6379> GETBIT result 1
(integer) 0
127.0.0.1:6379> GETBIT result 2
(integer) 0
127.0.0.1:6379> GETBIT result 3
(integer) 0
127.0.0.1:6379> get result
"\x00"

按位或操作:

注:按位或操作的结果应为1111

127.0.0.1:6379> BITOP OR result bit1 bit2
(integer) 1

查看结果:

127.0.0.1:6379> GETBIT result 0
(integer) 1
127.0.0.1:6379> GETBIT result 1
(integer) 1
127.0.0.1:6379> GETBIT result 2
(integer) 1
127.0.0.1:6379> GETBIT result 3
(integer) 1

按位取反操作:

注:bit1按位取反的结果应为0100

127.0.0.1:6379> BITOP not result bit1
(integer) 1

查看结果:

127.0.0.1:6379> GETBIT result 0
(integer) 0
127.0.0.1:6379> GETBIT result 1
(integer) 0
127.0.0.1:6379> GETBIT result 2
(integer) 1
127.0.0.1:6379> GETBIT result 3
(integer) 0

按位异或操作:

注:按位异或的结果应为1111

BITOP xor result bit1 bit2

查看结果:

127.0.0.1:6379> GETBIT result 0
(integer) 1
127.0.0.1:6379> GETBIT result 1
(integer) 1
127.0.0.1:6379> GETBIT result 2
(integer) 1
127.0.0.1:6379> GETBIT result 3
(integer) 1

5.4.3 BITCOUNT操作

  • BITCOUNT

    • 语法:BITCOUNT key [start end]

    • 功能:统计key在指定范围内的1的出现次数.0, -1或不写参数表示统计范围为整个key

注:关于BITCOUNT命令中的start, end:

start, end表示字符串中的字节偏移,而不是比特偏移.这一点非常重要.

  • start:是子范围的起始字节位置(从0开始)

  • end:是子范围的结束字节位置

例如,对于字符串"foobar":

  • 字符"f"在字节偏移0中

  • 字符"o"在字节偏移1和2中

  • 字符"b"在字节偏移3中

  • ...以此类推。

如果你执行命令BITCOUNT key 0 1.它会计算"fo"中设置为1的比特位的数量,因为"fo"占据了字节偏移0到1

还有一些其他需要注意的事项:

  1. 当start和end都是正数或0时,范围包括start和end两端

  2. 当start或end是负数时,它表示从字符串的末尾开始的偏移.例如,-1表示字符串的最后一个字节

  3. 如果start大于字符串的长度,或end小于0,结果将是 0

  4. 如果end在start之后,则它们会被交换.所以命令BITCOUNT key 2 0和BITCOUNT key 0 2会产生相同的结果

例:统计用户在线天数

设置用户在线天数

127.0.0.1:6379> SETBIT user1 0 1
(integer) 0
127.0.0.1:6379> SETBIT user1 3 1
(integer) 0
127.0.0.1:6379> SETBIT user1 7 1
(integer) 0

统计用户在线天数:

127.0.0.1:6379> BITCOUNT user1
(integer) 3
127.0.0.1:6379> BITCOUNT user1 0 0
(integer) 3
Previous5.3 地理位置相关操作Next5.5 慢查询实战分析

Last updated 1 year ago