【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

相关文章

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取