我命由我,不由天!


  • 搜索
prometheus docker golang linux kubernetes

redis-位图(四)

发表于 2021-05-29 | 0 | 阅读次数 392

位图

位图的最小单位是比特,每个bit的取值只能是0或1,不是特殊的数据结构,它的内容其实是普通的字符串,也就是byte数组。我们可以用普通的set/get直接获取和设置整个位图的内容,也可以使用位图操作getbit/setbit等将byte数组看成"位数组"来处理。

基本用法

redis的位数组是自动扩展的,如果设置了某个偏移位置超出了现有的内容范围,就会自动将位数组进行零扩充

setbit s 1 1
setbit s 2 1
sitbit s 4 1
sitbit s 9 1
sitbit s 10 1
sitbit s 13 1
sitbit s 15 1
get s
getbit s 1 1
  1. 零存整取

  2. 零存零取

  3. 整存整取

如果对于的字符是不可打印字符,redis-cli会显示该字符的十六进制形式

统计和查找

bitcount来统计指定范围内1的个数

bitops用来查找指定范围内出现的第一个0或1 [start,end] start和end参数是字节索引

set w hello
bitcount w
bitcount w 0 0 
bitops w 0 

魔术指令bitfield

bitfield有三个子指令,分别是get、set、incrby。对指定位片段进行读写,但是最多只能处理64个连续的位,如果超出64位,就得使用多个子指令,bitfield可以一次执行多个子指令

set w hello
bitfield w get u4 0 # 从第一个位开始取4个位,结果是无符号数
bitfield w get u3 2 # 从第三个位开始取3个位,结果是无符号数
bitfield w get i4 0 # 从第一个位开始取4个位,结果是有符号数

可以一次执行多个子指令

bitfield w get u4 0 get u3 2 get i4 0 get i3 2 

使用set子指令将第二个字符e改成a,a的ASCII码是97

bitfield w set u8 8 97 # 从第9个位开始,将接下来的8个位用无符号数97替换

第三个子指令incrby,对指定范围的位进行自增操作。自增有可能出现溢出,增加正数,出现上溢出,负数出现下溢出

set w hello
bitfield w incrby u4 2 1 # 从第三个位开始,对接下来的4位无符号数 + 1
bitfield w incrby u4 2 1

bitfield 指令提供了溢出策略子指令overflow,用户可以选择溢出行为,默认是折返(wrap),还可以选择失败(fail)报错不执行,以及饱和截断(sat)超过了范围就停留在最大或最小值。只影响第一条指令,后面还是warp

饱和极端

set w hello
bitfield w overflow sat incrby u4 2 1
bitfield w overflow sat incrby u4 2 1

失败不执行

set w hello
bitfield w overflow fail incrby u4 2 1
  • 本文作者: Dante
  • 本文链接: https://gaodongfei.com/archives/redis-位图
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
redis-延时队列(三)
redis-HyperLogLog(五)
  • 文章目录
  • 站点概览
Dante

Dante

119 日志
5 分类
5 标签
RSS
Creative Commons
0%
© 2023 Dante
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4
沪ICP备2020033702号