redis数据类型-位域bitfield
文档
- redis单机安装
- redis常用的五种数据类型
- redis数据类型-位图bitmap
- redis数据类型-基数统计HyperLogLog
- redis数据类型-地理空间GEO
- redis数据类型-流Stream
官方文档
- 官网操作命令指南页面:https://redis.io/docs/latest/commands/?name=get&group=string
- BITFIELD
位域:bitfield
说明
- 将redis字符串视为位数组
hello
字符串占用5个字节,一个字节8位,hello
用二进制表示为:h
:01101000
,e
:01100101
,l
:01101100
,l
:01101100
,o
:01101111
- 二进制转换为十进制,有两种方式,按照有符号转换和无符号转换,有符号转换时,首位为
1
的表示负数,例如:一个4位的二进制1100
,无符号转换为:12
,有符号转换为:-4
- 二进制转换为十进制,一个字节为一组,
hello
可以表示为:h
:104
,e
:101
,l
:108
,l
:108
,o
:111
- redis命令参数中,
u8
表示一个8位二进制按无符号转换为十进制整数,i16
表示一个16位二进制按有符号转换为十进制整数
基本命令
set k1 hello
:普通的set命令bitfield k1 get u8 0
:k1的值,从第0位开始,取8位,按无符号方式转换为十进制整数。返回:104
bitfield k1 set i8 8 97
:k1的值,从第8位开始,取8位,设置为97,97转化为8位有符号二进制为01100001
,对应的字符为a
。返回上一个当前位置的值,十进制bitfield k1 incrby u8 0 1
:k1的值,从第0位起,取8位,加1,按无符号方式转换为十进制整数。返回当前位置的值,十进制
溢出控制
bitfield k1 overflow wrap set u4 0 17
:当设置的值大于或小于4位无符号二进制时,采用回绕的方式进行设置,这里设置的值为1
。返回上一个当前位置的值,十进制bitfield k1 overflow sat set u4 0 17
:饱和计算,上溢取最大值,下溢取最小值,这里设置的置为15
。返回上一个当前位置的值,十进制bitfield k1 overflow fail set u4 0 17
:溢出时,拒绝执行。返回:(nil)
举例
将hello
变更为hatlo
hello
按字节分组,二进制为:h
:01101000
,e
:01100101
,l
:01101100
,l
:01101100
,o
:01101111
hello
按字节分组,十进制为:h
:104
,e
:101
,l
:108
,l
:108
,o
:111
hatlo
按字节分组,二进制为:h
:01101000
,a
:01100001
,t
:01110100
,l
:01101100
,o
:01101111
hatlo
按字节分组,十进制为:h
:104
,a
:97
,t
:116
,l
:108
,o
:111
方式1,按照字节变更,将第8
位开始连续8
位设置为97
,将第16
位开始连续8
位设置为116
set k2 hello
bitfield k2 set u8 8 97
bitfield k2 set u8 16 116
get k2
方式2,将整体的二进制放到一起,观察需要变更的位
hello
:0110 1000,0110 0101,0110 1100,0110 1100,0110 1111
hatlo
:0110 1000,0110 0001,0111 0100,0110 1100,0110 1111
可以看到,只需要从第12
位开始的连续10
位变更即可,无符号二进制0001 0111 01
,即00 0101 1101
,转十进制为93
set k3 hello
bitfield k3 set u10 12 93
get k3