目录
目标
列举redis中与string val相关的指令,将指令分为bit、string、数字3组,包括作用、使用时需要注意的地方等。可用于高效计算实时指标、排它锁、计数器、限制器。
将val视为bit数据
BITCOUNT
BITCOUNT key [startCharIndex endCharIndex]
O(N)
将String val视为bit数组形式,返回bit为1的bit数量,即群体统计,可指定字符index范围,index为0表示第一个字符,index为-1表示最后一个字符
BITFIELD
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
since 3.2
O(1)
将key对应string val视为bit数组,使用offset(based-0)和特定bit宽度确定field且进行操作,支持在一个命令中对多个field执行不同的操作。如从位偏移1000开始,对5位的无符号整数进行读取、设置、增加、减少并可设置上溢下溢行为。
为什么提供该指令
出于高效使用内存的目的,可以将很多小整数存储在一个大bitmap中,这样也避免出现大批key。
bit顺序
- offset是从左向右计数,左侧第一个bit为offset-0.
- offset和宽度确定field后,该field左为高位,右为低位。
子命令
- GET <type> <offset> -- 返回特定宽度的 bit field
- SET <type> <offset> <value> -- 设置特定宽度 bit field,返回旧数据.
- INCRBY <type> <offset> <increment> --针对特定宽度bit field进行增加或减少操作,返回最新数据.
- OVERFLOW [WRAP|SAT|FAIL] 仅对紧跟其后的一个INCRBY子命令其作用,指定溢出的处理方式
类型
- 使用i表示有符号整数,u表示无符号整数,后边使用数字表示占用bit位数,如i6 6bit有符号整数,u2 2bit无符号整数。
- redis仅支持最多64bit有符号整数,最多63bit无符号整数(redis无法复制64bit无符号整数).
offset
- 无前缀整数,表示based-0的bit偏移量,如1000,表示偏移量为1000的bit
- 前缀#,表示offset=bit宽度乘以#后的数字, i8 #0 表示offset=8*0, i8 #i表示offset=8*1。当使用string val的存储整数数组数据时,可以使用该方式#后为元素index。
OVERFLOW溢出
允许用户针对增加或减少操作,选择溢出的处理方式
wrap 环绕式,默认方式
无符号整数,对溢出进行取模处理,如u2最大整数个数为2^2=4,当前数据为3,则加1后为4,溢出采用4%4,则结果为0
有符号整数,对溢出的处理为在正max和负min之间变化,如i8,当前为正max127,加1后变为负min-128,之后再加1,变为正max127
SAT 饱和式
当增加时,上限为正max,如i8当前120,加10,结果为上限127,继续增加结果不变
当减少时,下限为负min
FAIL 操作失败式
溢出时不对数据进行任何操作,仅返回NULL以告知client发生溢出
每个overflow命令仅对紧跟overflow之后一个increby命令起作用,未指定overflow,则默认使用wrap方式。
举例
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
1) (integer) 1
2) (integer) 1
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
1) (integer) 2
2) (integer) 2
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
1) (integer) 3
2) (integer) 3
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
1) (integer) 0 // 第一个inc