Redis-bitmaps的介绍与应用

Redis-bitmaps

 

·什么是bitmaps

Bitmaps并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合。因为字符串是二进制安全的块,他们的最大长度是512M。

字节操作可以分为两类:恒定时间的单个字节操作如将一个字节设置为1或者0、或者获取一个字节的值,和批量字节操作如在给定的字节范围内计算设置字节的数量。

 

Redis-bitmaps的介绍与应用_第1张图片

 

Redis中bitmaps的常用操作

基本使用

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

 

1. setbit key offset value

  • 给位图指定索引设置值,返回该索引位置的原始值

(1).“零存零取”

Redis-bitmaps的介绍与应用_第2张图片

(2).“整存零取”

Redis-bitmaps的介绍与应用_第3张图片

Redis-bitmaps的介绍与应用_第4张图片

如果对应位的字节是不可打印字符,redis-cli 会显示该字符的 16 进制形式。

Redis-bitmaps的介绍与应用_第5张图片

 

2. getbit key offset

  • 获取位图指定索引的值
  • 不存在的 key 被当成是空字符串来处理

Redis-bitmaps的介绍与应用_第6张图片

3. bitcount key [start end]

Redis-bitmaps的介绍与应用_第7张图片

4. bitpos key targetBit [start] [end] (起始版本:2.8.7)

  • 计算位图指定范围(startend,单位为字节,如果不指定就是获取全部)第一个偏移量对应的值等于targetBit的位置。

Redis-bitmaps的介绍与应用_第8张图片

5. bitop and|or|not|xor destkey key [key...]

  • 做多个bitmapand(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存到destkey中。

Redis-bitmaps的介绍与应用_第9张图片

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

 

6.魔术指令 bitfield

前文我们设置 (setbit) 和获取 (getbit) 指定位的值都是单个位的,如果要一次操作多个位,就必须使用管道来处理。

不过 Redis 3.2 版本以后新增了一个功能强大的指令,有了这条指令,不用管道也可以一次进行多个位的操作。

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

Redis-bitmaps的介绍与应用_第10张图片

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

接下来一次执行多个子指令:

然后我们使用 set 子指令将第二个字符 e 改成 aa ASCII 码是 97,返回旧值。

再看第三个子指令 incrby,它用来对指定范围的位进行自增操作。既然提到自增,就有可能出现溢出。如果增加了正数,会出现上溢,如果增加的是负数,就会出现下溢出。Redis 默认的处理是折返。如果出现了溢出,就将溢出的符号位丢掉。如果是 8 位无符号数 255,加 1 后就会溢出,会全部变零。如果是 8 位有符号数 127,加 1 后就会溢出变成 -128

接下来实践一下这个子指令 incrby :

Redis-bitmaps的介绍与应用_第11张图片

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

 

饱和截断 SAT

Redis-bitmaps的介绍与应用_第12张图片

失败不执行 FAIL

 

Redis-bitmaps的介绍与应用_第13张图片

你可能感兴趣的:(bitmaps,redis)