Redis-bitmaps的介绍与应用

Redis-bitmaps

 

·什么是bitmaps

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

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

 

 

Redis中bitmaps的常用操作

基本使用

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

 

1. setbit key offset value

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

(1).“零存零取”

(2).“整存零取”

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

 

2. getbit key offset

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

3. bitcount key [start end]

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

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

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

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

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

 

6.魔术指令 bitfield

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

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

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

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

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

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

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

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

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

 

饱和截断 SAT

失败不执行 FAIL

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值