1. Bitfield简介

Bitfield(位域)命令可以将一个 Redis 字符串看作是一个由二进制位组成的数组, 并对这个数组中任意偏移进行访问 。

BITFIELD 命令的作用在于它能够将很多小的整数储存到一个长度较大的位图中,又或者将一个非常庞大的键分割为多个较小的键来进行储存,从而非常高效地使用内存,使得 Redis 能够得到更多不同的应用 --特别是在实时分析领域:BITFIELD 能够以指定的方式对计算溢出进行控制的能力,使得它可以被应用于这一领域。

Bitfield功能就是: 位域修改+溢出控制

以上是Bitfield的一些概念,比较抽象. 直接来看命令

2. BITFIELD key [GET type offset]

BITFIELD key [GET type offset]: 返回指定的位域

  • key: 要操作的Redis键。
  • GET: 表示要从字符串值中读取位。
  • type: 指定读取数据的类型,可以是u(无符号整数)、i(有符号整数)
  • offset: 位字段的起始偏移位置,从0开始计数。
127.0.0.1:6379> set k1 abcd
OK
127.0.0.1:6379> get k1
"abcd"
127.0.0.1:6379> bitfield k1 get i8 0
1) (integer) 97
127.0.0.1:6379> bitfield k1 get i8 8
1) (integer) 98
127.0.0.1:6379> 
  • i8: 有符号8位

在这里插入图片描述

Bitfield(位域)命令可以将一个 Redis 字符串看作是一个由二进制位组成的数组,因此返回值就是这些字符对应的ASCII码值

3. BITFIELD key [SET type offset value]

BITFIELD key [SET type offset value]:设置指定位域的值并返回它的原值

  • key: 要操作的Redis键。
  • SET: 表示要设置字符串值中的位。
  • type: 类型标识,可以是u(无符号整数)、i(有符号整数)。同GET操作,目前Redis不直接支持浮点数的位操作。
  • offset: 要设置位字段的起始偏移位置。
  • value: 要设置的值,根据类型不同,这个值有不同的解释。对于整数,它是你希望写入的整数值。

示例:

127.0.0.1:6379> bitfield k1 set i8 0 111
1) (integer) 97
127.0.0.1:6379> get k1
"obcd"
127.0.0.1:6379> 

111对应ASCII码表中对应’o’,可以看到’a’已经被修改成’o’了
在这里插入图片描述

4. BITFIELD key [INCRBY type offset increment]

  • key: 要操作的Redis键。
  • INCRBY: 表示自增。
  • type: 类型标识,可以是u(无符号整数)、i(有符号整数)。同GET操作,目前Redis不直接支持浮点数的位操作。
  • offset: 要设置位字段的起始偏移位置。
  • increment: 自增的数值。

示例:

127.0.0.1:6379> get k1
"obcd"
127.0.0.1:6379> bitfield k1 incrby i8 0 1
1) (integer) 112
127.0.0.1:6379> get k1
"pbcd"
127.0.0.1:6379> 

有符号8位二进制表示是有范围的: -128~127,如果一直自增就会溢出.

而Redis提供了三种移除控制方式:

  • WRAP:使用回绕(wrap around)方法处理有符号整数和无符号整数的溢出情况
  • SAT: 使用饱和计算(saturation arithmetic)方法处理溢出下溢计算的结果为最小的整数值,而上溢计算的结果为最大的整数值
  • FAIL: 命令将拒绝执行那些会导致上溢或者下溢情况出现的计算,并向用户返回空值表示计算未被执行

WRAP方式示例:

127.0.0.1:6379> bitfield k1 set i8 0 127
1) (integer) 112
127.0.0.1:6379> bitfield k1 get i8 0
1) (integer) 127
127.0.0.1:6379> bitfield k1 incrby i8 0 1
1) (integer) -128
127.0.0.1:6379> bitfield k1 get i8 0
1) (integer) -128
127.0.0.1:6379> 

SAT方式示例:

127.0.0.1:6379> bitfield k1 overflow sat set i8 0 128
1) (integer) -128
127.0.0.1:6379> bitfield k1 get i8 0
1) (integer) 127
127.0.0.1:6379> 

FAIL方式示例:

127.0.0.1:6379> bitfield k1 overflow fail set i8 0 128
1) (nil)
127.0.0.1:6379> bitfield k1 get i8 0
1) (integer) 127
127.0.0.1:6379> 
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐