Redis高级数据结构——位图

Redis中的位图数据结构能有效节省存储空间,尤其适合处理大量布尔值数据。本文详细介绍了如何使用位图进行‘零存整取’、‘零存零取’和‘整存零取’等操作,以及位图的统计和查找功能。通过位运算设置和获取位值,实现字符串的位级操作。此外,Redis 3.2后的bitfield指令支持一次进行多个位的操作,包括设置、获取和自增,并提供了溢出策略选项。位图在用户签到、统计分析等场景下具有显著优势。
摘要由CSDN通过智能技术生成

Redis高级数据结构——位图

 对于bool型数据,存取时使用普通的key/value会占很大的内存,可以使用位图来存放,可以大大节省存储空间。
 比如用户的签到情况,1表示已签到,0表示未签到,那么一年的签到情况只需要使用一个365位(46个字节)的空间即可存储。若是使用字符串的话则需要365个字节,当用户数量庞大的时候,使用位图是非常节省空间的。
 位图不是特殊的数据结构,其实就只是一个byte数组,如下图所示。
在这里插入图片描述

1.位图的基本操作

setbit key offset value #将位图中的offset位设为value

getbit key offset #得到位图中offset位的值

(1)零存整取
 所谓“零存整取”就是,使用setbit对位值进行逐个设置,再将整个字符串取出。
下面使用位操作将字符串设置为“hello”。
 首先,需要得到hello的ASCII码,用python命令 bin(ord())获得
在这里插入图片描述
 接下来使用位操作进行设置得到“hello”,这里只需要设置值为1的位,因为位数组默认为全0的,且redis的位数组是自动扩展的,扩充时会自动将数组进行0扩充。
在这里插入图片描述
在这里插入图片描述
 经过对图中值为1的位置进行置1之后,得到了"hello"。

(2)零存零取
 使用单个位操作设置位值,使用单个位操作获取具体位值
 获取上面"hello"的4, 11, 34位
在这里插入图片描述
在这里插入图片描述
 获取的是图中蓝色块的值。

(3)整存零取
 使用字符串操作批量设置位值,使用单个位操作获取具体位值
在这里插入图片描述
(2)位图的统计和查找

bitcount key [start end] #统计指定范围内1的个数

bitpos key bit [start end] #查找指定范围内出现的第一个0或1

 注意这里的指定范围不是按位来算的,按的是字符串字符数组的位置

在这里插入图片描述
3.多个位的操作

 redis在3.2版本以后新增了一个指令bitfield,有了这个指令,可以不用管道也可以一次进行多个位的操作。

bitfield key get type offset #从指定位置开始取多个位

 从0号位开始,取4个位,结果是无符号数(u)
 取得结果为6,二进制为0110
在这里插入图片描述
在这里插入图片描述

 从2号位开始,取3个位,结果是有符号数(i)。
 取得结果为-3,二进制为1111 1101,由于是有符号数,则前面全部补1。
在这里插入图片描述
在这里插入图片描述
 可以一次执行多个子指令
在这里插入图片描述
在这里插入图片描述

bitfield key set type offset value #从指定位置开始设置多个位的值
从8号位开始,接连8个位都用无符号数97替换

在这里插入图片描述
 可以看到这里e被替换为a了

bitfield key incrby type offset increment #从指定位置开始对多个位进行自增

 从2号位开始,对接连4个位构成的无符号数+2
 得到12,即为1010+0010 = 1100,为12的二进制
 此时h变为了p,p的二进制为0111 0000
在这里插入图片描述
在这里插入图片描述
 接着我们继续对这4位构成的无符号数+2,发现变0了
在这里插入图片描述
 此时这段的值依次变为
 1100 + 0010 = 1110
 1110 + 0010 = 10000
 发现此时出现了溢出,因而变为了0
 redis默认的处理溢出是折返,如果出现了溢出,就将溢出的符号位丢掉。

 其实bitfield指令提供了溢出策略子指令overflow,用户可以选择溢出行为,默认为折返,还可以选择失败不执行,或者饱和截断。
 overflow指令值影响接下来的第一条指令,这条指令执行完后溢出策略会变成默认值折返。

失败不执行(fail)
 报错不执行此次增加
在这里插入图片描述
饱和截断(sat)
 超过了范围就停留在最大值或最小值上
在这里插入图片描述
 当然bitfield还可以同时执行这三种子指令
在这里插入图片描述

 字符串变为下图所示
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loser与你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值