千家信息网

Redis位图怎么用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编给大家分享一下Redis位图怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redis也有这样的结构名叫位图,位图
千家信息网最后更新 2026年11月01日Redis位图怎么用

小编给大家分享一下Redis位图怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Redis也有这样的结构名叫位图,位图最小的单位是bit,每个bit是由0或1构成,我们的字符串就是由很多个bit数组组成的,所以我们在使用位图的时候是可以把一组bit转换成字符串,也可以由字符串转换成bit数组。

位图基本用法

如下,"h"的ACSLL码是0110 1000

> setbit name 1 1    #设置位图的位置(integer) 0> setbit name 2 1(integer) 0> setbit name 4 1(integer) 0> get name          #获取这个位图转换成字符串的值"h"> getbit name 1     #获取位图的某个位置是否有值(integer) 1> getbit name 3(integer) 0

字符串转位图

> set kh h       #存字符串OK> getbit kh 1    #第二个位置的bit是1(integer) 1> getbit kh 3    #第四个位置的bit是0(integer) 0

注意:如果对应位的字节是不可打印字符,redis会显示该字符的十六进制形式。

> setbit x O 1(integer) 0> setbit x 1 1(integer) 0> get x"\xc0"
统计和查找

Redis位图提供bitcount和bitpos指令,bitcount用来统计一定范围内1的个数,bitpos用来查找指定范围内出现的第一个0或者1。

这里我们需要注意的是参数start_index和end_index是字节索引,简单的来说就是他们只能是8的倍数而不是指定值。

咱们对照下图来看

> set name helloOK127.0.0.1:6379> bitcount name    #计数所有的1的个数(integer) 21127.0.0.1:6379> bitcount name 0 1    #获取前两个字符出现1的个数(integer) 7127.0.0.1:6379> bitcount name 0 0    #获取第一个字符出现1的个数(integer) 3127.0.0.1:6379> bitpos name 1    #获取第一个1出现的位置(integer) 1127.0.0.1:6379> bitpos name 0    #获取第一个0出现的位置(integer) 0127.0.0.1:6379> bitpos name 1 1 1    #获取第二个字符1出现的位置(integer) 9
关于位图批量操作

我们通过setbit和getbit指令来操作位图都是一次操作一个位,那么有时候我们需要一次性操作多个位,如何操作呢?

在Redis3.2版本之前我们可以使用管道来一次性操作多个指令,redis给我们提供了bitfield指令,该指令有三个子指令分别是get、set、incrby它们都可以对指定位片段进行读写,但是最多只能处理64个连续的位,如果超过64位,就得使用多个子指令,bitfield 可以一次执行多个子指令。

Get

下面我们来看例子,还是使用上面的name=hello

字母
数值二进制
h
104
0110 1000
e101
0110 0101
l108
0110 1100
l108
0110 1100
o111
0110 1111
> bitfield name get u4 0    #第一个位开始取4个位(0110),结果为无符号数(u)(integer) 6> bitfield name get u3 2    #第三个位开始取3个位(101),结果为无符号数(u)(integer) 5> bitfield name get i4 0    #第一个位开始取4个位(0110),结果为有符号数(i)(integer) 6> bitfield name get i3 2    #第三个位开始取3个位(101),结果为有符号数(i)(integer) -3

下面我们才试试批处理

> bitfield name get u4 0 get u3 2 get i4 0 get i3 2(integer) 6(integer) 5(integer) 6(integer) -3

有符号数是指获取的位数组中第一个位是符号位,剩下的才是值。如果第一位是1,那就是负数。无符号数表示非负数,没有符号位,获取的位数组全部都是值。有符号数最多可以获取 64 位,无符号数只能获取 63 位(因为 Redis 协议中的integer是有符号数,最大 64 位,不能传递 64 位无符号值)。

Set

下面我们来使用set,把hello的e变成a,a的ASCLL码是97

>bitfield name set u8 8 97    #从第八位开始,接下来的8位用无符号的ASCLL码97代替(integer)101 >get name"hallo"
Incrby

这个指令用来自增,如果自增到最大值的时候会溢出,如果是无符号那么就变成0,如果是有符号的就会变成负数,向下自增反之。

bitfield指令提供溢出策略的指令overflow,用户可以指定类型,默认为:wrap,溢出及折返,还可以选择失败:fail,失败不执行,截断:sat,溢出就停留。

> bitfield name incrby u4 2 1    #从第三个位开始,对接下来的4位元符号数+ 1(integer) 11> bitfield name incrby u4 2 1(integer) 12> bitfield name incrby u4 2 1(integer) 13> bitfield name incrby u4 2 1(integer) 14> bitfield name incrby u4 2 1(integer) 15####sat> bitfield name overflow sat incrby u4 2 1    #保持最大值(integer) 15####fail> bitfield name overflow fail incrby u4 2 1    #不执行(nil)####wrap> bitfield name incrby u4 2 1    #溢出折返(integer) 0

以上是"Redis位图怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

位图 字符 指令 号数 个位 字符串 符号 位置 个数 多个 结果 最大 三个 篇文章 负数 一次性 位数 内容 字节 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 疫情对互联网科技公司影响 腾讯阿里互联网科技 金融科技创新监管互联网金融 互联网科技金融 科技与互联网发展 互联网金融 金融科技 滨湖区互联网智能科技产品供应 成都玖崟互联网科技有限公司乐商圈怎么样 新华互联网科技2019 哈尔滨新华互联网科技学院 须眉科技是互联网公司吗 字节跳动和互联网科技 北京华百购互联网科技有限公司 茂名市互联网科技产业园 互联网科技与管理 互联网保险科技创业 天津腾达互联网科技有限公司 上海科技产业互联网平台 互联网科技对化妆品行业 咖啡网 广东猪兼强互联网科技有限公司 河南云网互联网络科技有限公司 金诺互联网科技 奇士达互联网科技 美国互联网黑科技 万达互联网科技 互联网科技创新企业排名 受益于互联网科技的高速发展 烟台灵鸽互联网科技有限公司
0