Redis(位图Bitmap和位域Bitfield)

位图:

位图是字符串类型的扩展。

Redis中的位图是一种特殊的数据结构,用于表示一系列位的集合。它可以存储大量的布尔值数据,每个位代表一个布尔值(0或1),并且可以对这些位进行各种位运算操作。位图通常用于记录用户的行为数据、统计数据等,以及节省存储空间和快速计算数据的需求。 Redis提供了一系列的位图操作命令,可以对位图进行设置、获取、统计、位运算等操作。

位图的命令中都有BIT。

使用SETBIT 来设置位图, 前面的数字是偏移量,后面的数字是值。使用GETBIT获取偏移量的值。

前面说过位图是字符串类型的扩展,所以可以使用设置字符串的命令来设置位图,如上图就可以一次性设置多个偏移量。

使用 BITCOUNT查询位图中1的个数。和C++STL中的bitset中的count函数效果一样。

在Redis中,BITPOS命令用于查找指定位图中第一个设置或清除的位的位置。其基本语法如下:

cpp 复制代码
BITPOS key bit [start] [end]
  • key:要操作的位图的键名。

  • bit:要查找的位的值,可以是0或1。

  • start:可选参数,指定起始位置,默认为0。

  • end:可选参数,指定结束位置,默认为-1(表示整个位图)。

BITPOS命令会在指定的起始位置到结束位置范围内查找第一个设置或清除的位的位置,并返回其索引值。如果指定的位值在指定范围内不存在,则返回-1。

例如,假设有一个名为mybitmap的位图,我们可以使用以下命令来查找第一个设置为1的位的位置:

cpp 复制代码
BITPOS mybitmap 1

这将返回第一个设置为1的位的位置,如果不存在则返回-1。

如果我们想在指定范围内查找第一个设置为0的位的位置,我们可以使用以下命令:

cpp 复制代码
BITPOS mybitmap 0 2 5

这将在mybitmap位图的索引2到索引5之间查找第一个设置为0的位的位置。

总之,BITPOS命令可以用于在位图中查找指定位值的位置,是对位图进行操作和查询的有用工具。

位域:

在 Redis 中,位域(Bitfield)是一种用于操作位图的高级命令。通过位域命令,可以对位图中的指定位进行读取、设置、清除等操作。

位域命令的基本语法如下:

cpp 复制代码
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]

其中,各个参数的含义如下:

  • key:要操作的位图的键名。

  • GET type offset:从位图中获取指定偏移量处的位的值。

  • SET type offset value:设置位图中指定偏移量处的位的值。

  • INCRBY type offset increment:对位图中指定偏移量处的位进行增加或减少操作。

  • OVERFLOW WRAP|SAT|FAIL:指定位域命令的溢出行为,可以选择包装(WRAP)、饱和(SAT)或失败(FAIL)。

通过位域命令,可以方便地对位图进行各种复杂的位操作,如获取、设置、增减等。这使得 Redis 的位图数据结构更加灵活和强大,能够更加高效地处理布尔值数据。

总之,位域是 Redis 中用于操作位图的高级命令,可以对位图中的位进行各种操作,是对位图数据结构的扩展和增强。

位域能将很多小的整数存储到一个较大的位图中,这样就可以更加高效的使用内存。

使用位域可以做出一个游戏角色的属性图。

使用BITFIELD设置等级为1,上图U8的意思是一个8位的无符号整数,#0表示第一个位置。

若使用i8则表示,8位有符号整数。

使用GET查看内存中的情况,返回的是十六进制的01.若想查看10进制的等级只需要将第一句语句中的set改成get就好了。

#1代表第二个位置,他后面的100为设置的值,可以将他看作金钱数量为100。使用GET查看内存中的情况。

可以使用incrby来增加100个金币。 减少就可以使用-100。

相关推荐
小马爱打代码7 分钟前
框架 - 组件 - 中间件:生产级参数配置指引
数据库·中间件
asdfg125896324 分钟前
一文通俗理解JDBC中的核心概念+案例
java·数据库·oracle·jdbc
点灯小铭31 分钟前
基于单片机与DAC0832的双路波形信号发生系统设计
数据库·单片机·mongodb·毕业设计·课程设计·期末大作业
小陈phd37 分钟前
Text2SQL智能体学习笔记(二)——NL2SQL落地的隐形基石:元数据库
数据库·笔记·学习
霸道流氓气质38 分钟前
阿里云 OSS 从零到实战:概念、配置与 Spring Boot 集成指南
数据库·spring boot·阿里云
茉莉玫瑰花茶38 分钟前
综合案例 - AI 智能租房助手 [ 4 ]
数据库·python·ai·langgraph
ULIi096kr40 分钟前
MySQL查看表创建时间、修改时间、最后更新时间(精准排查僵尸表)
数据库·mysql
折哥的程序人生 · 物流技术专研1 小时前
Tomcat 严重警告:JDBC 驱动未注销 + 工作线程泄漏 —— 原因、影响与彻底修复(生产级终极指南)
java·运维·数据库·mysql·oracle·tomcat
初圣魔门首席弟子1 小时前
Qt C++ 项目实战:修改共享头文件后的高效增量编译与快速发布流程
数据库
wb043072011 小时前
仓库搬家不停业——从阿明的“在线换仓库“,看数据库迁移与 Schema 演进的实战方法论
数据库·adb·架构