【Redis7】10大数据类型之Bitmap类型

2024-05-10 20:28

本文主要是介绍【Redis7】10大数据类型之Bitmap类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.Bitmap(位图)
  • 2.常用命令
  • 3.示例
    • 3.1 SETBIT和GETBIT
    • 3.2 STRLEN
    • 3.3 BITCOUNT
    • 3.4 BITOP

1.Bitmap(位图)

Redis的Bitmap类型并不是一个独立的数据类型,而是对String类型的一种巧妙使用,允许开发者以位级别操作字符串中的数据。Bitmap可以视为一个巨大的位数组,每个位(bit)可以存储0或1的值,这使得Bitmap非常适合用于存储和操作大量的布尔值或者进行高效的统计计数。

Bitmap文持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42,9亿的字节信息(2^32=4294967296)

特点

  1. 空间效率:Bitmap极其节省空间。例如,一个整数占用4字节(32bit位),而使用Bitmap表示同样的32个布尔值只需要1字节。
  2. 灵活性:可以对每个位进行独立设置、清除、检查操作。
  3. 计算能力:支持按位与、或、异或等操作,以及位计数等高级操作,这对于统计和分析非常有用。
  4. 适用于计数和追踪:如网站用户是否登录、用户特征标记、事件发生频率统计等场景。

2.常用命令

  • SETBIT key offset value:设置位图中指定偏移量的值。
  • GETBIT key offset:获取位图中指定偏移量的值。
  • strlen key:获取该Bitmap所占用的字节数,而不是比特位中1的个数。
  • BITCOUNT key [start end]:计算位图中位值为1的个数,可选地限制在指定范围内。
  • BITOP operation destkey key [key ...]:对多个位图执行AND、OR、NOT、XOR操作,并将结果保存到destkey。
  • BITFIELD key [GET type offset] [SET type offset value] [...]:更复杂的位操作,可以一次执行多个位操作。

3.示例

3.1 SETBIT和GETBIT

SETBIT key offset value:设置位图中指定偏移量的值。

GETBIT key offset:获取位图中指定偏移量的值。

offset从0开始

127.0.0.1:6379> setbit k1 1 1
(integer) 0 # 返回值是设置前的值
127.0.0.1:6379> setbit k1 1 0
(integer) 1
127.0.0.1:6379> setbit k1 2 1 
(integer) 0
127.0.0.1:6379> setbit k1 3 3 # 值只能是0和1
(error) ERR bit is not an integer or out of range
127.0.0.1:6379> getbit k1 0
(integer) 0
127.0.0.1:6379> getbit k1 1
(integer) 0
127.0.0.1:6379> getbit k1 2
(integer) 1
127.0.0.1:6379> 

3.2 STRLEN

strlen key:获取该Bitmap所占用的字节数,而不是比特位中1的个数。

127.0.0.1:6379> setbit k1 7 1
(integer) 1
127.0.0.1:6379> strlen k1
(integer) 1
127.0.0.1:6379> setbit k1 8 0
(integer) 0
127.0.0.1:6379> strlen k1
(integer) 2
127.0.0.1:6379> 

不是字符串长度而是占据几个字节,超过8位后自己按照8位一组一byte再扩容

3.3 BITCOUNT

BITCOUNT key [start end]:计算位图中位值为1的个数,可选地限制在指定范围内。

127.0.0.1:6379> setbit k1 0 1
(integer) 0
127.0.0.1:6379> setbit k1 1 1
(integer) 0
127.0.0.1:6379> setbit k1 7 1
(integer) 0
127.0.0.1:6379> bitcount k1 
(integer) 3
127.0.0.1:6379> bitcount k1 0 3
(integer) 3
127.0.0.1:6379> bitcount k1 0 3 byte # 以byte为单位
(integer) 3
127.0.0.1:6379> bitcount k1 0 3 bit # 以bit为单位
(integer) 2
127.0.0.1:6379> 

3.4 BITOP

BITOP operation destkey key [key ...]:对多个位图执行AND(与)、OR(或)、XOR(异或)和NOT(非)操作,并将结果保存到destkey。

假设我们有两个Bitmap键use1user2,分别代表了两天内用户的在线状态,其中1表示在线,0表示离线。

他们三天中的在线状态如下:

127.0.0.1:6379> setbit user1 0 1
(integer) 0
127.0.0.1:6379> setbit user1 1 1
(integer) 0
127.0.0.1:6379> setbit user2 0 1
(integer) 0
127.0.0.1:6379> setbit user2 2 1
(integer) 0
127.0.0.1:6379> 

如果想要找出这两天都在线的用户,可以使用AND操作。

127.0.0.1:6379> bitop and k1 user1 user2
(integer) 1
127.0.0.1:6379> getbit k1 0
(integer) 1
127.0.0.1:6379> getbit k1 1
(integer) 0
127.0.0.1:6379> 

and操作: user1和user2对应位都是1的情况下才为1,否则为0。

如果我们想找出至少有一天在线的用户,可以使用OR操作。

127.0.0.1:6379> bitop or k2 user1 user2
(integer) 1
127.0.0.1:6379> bitcount k2
(integer) 3
127.0.0.1:6379> 

or操作: user1和user2只要有1,就是1.否则为0

如果我们要找出只在某一天在线,而不在另一天在线的用户,可以使用XOR操作。

127.0.0.1:6379> getbit k3 0
(integer) 0
127.0.0.1:6379> getbit k3 1
(integer) 1
127.0.0.1:6379> getbit k3 2
(integer) 1
127.0.0.1:6379> 

xor操作:user1和user2对应位不同时为1(即一位是1另一位是0)

另外,BITOP命令不直接支持NOT操作,因为NOT操作需要一个源位图和目标位图。但是,可以通过创建一个全1的Bitmap(假设长度与原Bitmap相同),然后使用XOR操作达到NOT的效果。

这篇关于【Redis7】10大数据类型之Bitmap类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977466

相关文章

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

Redis中的常用的五种数据类型详解

《Redis中的常用的五种数据类型详解》:本文主要介绍Redis中的常用的五种数据类型详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis常用的五种数据类型一、字符串(String)简介常用命令应用场景二、哈希(Hash)简介常用命令应用场景三、列表(L

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word