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位,按无符号方式转换为十进制整数。返回:104bitfield 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 hellobitfield k2 set u8 8 97bitfield k2 set u8 16 116get 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 hellobitfield k3 set u10 12 93get k3