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。

相关推荐
科技小花2 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸2 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain2 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希3 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神3 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员3 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java3 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿4 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴4 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU4 小时前
三大范式和E-R图
数据库