首页 > 编程知识 正文

redis内部编码,redis 位图

时间:2023-05-03 11:46:35 阅读:57417 作者:1457

文章目录一、位图位图简介二、位图常用指令三、位图存储整数值

一.位图位图介绍

Redis位图是一个由多个二进制位组成的数组,可以处理位图中指定的一个或多个二进制位,数组中的每个二进制位具有相应的偏移(也称为索引)。

二.通过使用位图的常规命令http://www.Sina.com/setbit,可以为位图偏移指定二进制位设置值

语法格式:设置位密钥偏移值,示例

#mybitmap偏移为0位置设定值1setbitmybitmap01#mybitmap偏移为1的位置设定值0SETBIT mybitmap 1 0# 的mybitmap偏移2的位置设置1SETBIT mybitmap 2 1当用户尝试通过执行SETBIT命令设置位图时,如果位图不存在或位图的当前大小满足用户希望执行的设置操作

SETBIT命令返回设置二进制位后、设置二进制位前的旧值。

与某些Redis命令可以使用负数作为偏移不同,SETBIT命令只能使用正偏移。 如果尝试输入负数作为偏移,则会发生错误

可以使用3358www.Sina.com/gitbit命令获取位图指定偏移上的二进制位的值

语法格式: GETBIT key offset,示例

获取mybitmap偏移1的值如果GETBIT mybitmap 1用户输入的偏移超过位图当前具有的最大偏移,GETBIT命令将返回0

可以使用设置二进制位的值BITCOUNT命令获取位图中值为1的二进制位数

语法格式: bit count键,例如

获取mybitmap值为1的二进制位数,在本例中为2位计数mybitmap。 缺省情况下,BITCOUNT命令统计位图中所有字节的二进制位,但使用可选的start和end参数,以使BITCOUNT仅为3358www.Sina .

在mybitmap的第一个和第二个二进制位中,1位计数mybitmap位计数命令的start和end参数的值可以是负数,也可以是负数,即负数索引

通过运行3358www.Sina.com/bitpos命令,可以查找位图中设置为指定值的第一个二进制位,并返回该二进制位的偏移

语法格式: bit pos密钥值,例如

缺省情况下,获取mybitmap第一个二进制值为1的偏移的BITOPS mybitmap 1与BITCOUNT命令一样,BITPOS命令的搜索范围将覆盖位图中包含的所有二进制位。 也可以使用可选的start和end参数,以便BITPOS命令仅搜索指定字节范围内的二进制位

如果尝试在用户不存在的位图或所有位图都设置为0的位图中查找值为1的二进制位,则BITPOS命令结果返回-1。 如果在所有位都设置为1的位图中搜索值为0的二进制位,则位图中不存在的二进制位的值将被视为0,因此BITPOS命令将返回位图的最大偏移加1后的值。

使用3358www.Sina.com/bitop命令,可以对一个或多个位图执行指定的二进制运算,并将运算结果保存到指定的密钥中

语法格式: bitopoperationresult _ keykey1key 2…,

其中,操作参数的值可以是AND、OR、XOR或NOT。 这四个值分别对应于逻辑积、逻辑和、逻辑和、逻辑非四种运算。 其中,在AND、OR、XOR三种运算中,用户可以使用任意数量的位图作为输入,在NOT运算中只能使用一个位图作为输入。 例如

BITSET mybitmap2 0 1#对mybitmap和mybitmap2执行或操作,并将结果存储在result _ mapbitoporresult _ bitmap mybitmap 2中时,bitop命令为两个长度

将计算结果存储在指定密钥中时,ITOP命令返回所存储位图的字节长度。

三.在位图中存储整数值的BITFIELD命令允许用户在位图的任何区域中存储指定长度的整数值,并对这些整数值执行加法或减法操作。

可以使用33558www.Sina.com/bitfield命令的SET子命令将指定类型的整数值设置为位图的指定偏移

语法: bitfield密钥集类型偏移值

其中type参数

用于指定被设置值的类型,这个参数的值需要以i或者u为前缀,后跟被设置值的位长度,i表示被设置的值为有符号整数,而u则表示被设置的值为无符号整数;offset即为指定的偏移;value参数用于指定被设置的整数值,这个值的类型应该和type参数指定的类型一致。如果给定值的长度超过了type参数指定的类型,那么SET命令将根据type参数指定的类型截断给定值。比如,如果用户尝试将整数123(二进制表示为01111011)存储到一个u4类型的区域中,那么命令会先将该值截断为4位长的二进制数字1011(即十进制数字11),然后再进行设置。如

# 在mybitmap3偏移量为0开始的地方处设置一个值为198的8位无符号数BITFIELD mybitmap3 SET u8 0 198

SET子命令会返回指定区域被设置之前的旧值作为执行结果。

BITFIELD命令允许用户在一次调用中执行多个子命令,比如,通过在一次BITFIELD调用中使用多个SET子命令,我们可以同时对位图的多个区域进行设置

除了根据偏移量对位图进行设置之外,SET子命令还允许根据给定类型的位长度,对位图在指定索引上存储的整数值进行设置,如

# 在索引为2,也就是第三个元素处设置值为199的8位无符号数BITFIELD mybitmap3 SET u8 #2 199 获取指定区域存储的值

通过使用BITFIELD命令的GET子命令,可以处给定的偏移量或者索引中取出指定类型的整数值
语法格式:
BITFIELD mybitmap3 GET type offset
BITFIELD mybitmap3 GET type #index
GET子命令各个参数的意义与SET子命令中同名参数的意义完全一样。

执行加法操作或减法操作

除了设置和获取整数值之外,BITFIELD命令还可以对位图存储的整数值执行加法操作或者减法操作,这两个操作都可以通过INCRBY子命令实现
语法格式:
BITFIELD key INCRBY type offset increment OVERFLOW WRAP|SAT|FAIL
BIRFIELD key INCRBY type #index increment OVERFLOW WRAP|SAT|FAIL
OVERFLOW子命令去控制INCRBY子命令在发生计算溢出时的行为,参数可以是WRAP、SAT或者FAIL中的一个:
·WRAP表示使用回绕(wrap around)方式处理溢出,这也是C语言默认的溢出处理方式。在这一模式下,向上溢出的整数值将从类型的最小值开始重新计算,而向下溢出的整数值则会从类型的最大值开始重新计算。
·SAT表示使用饱和运算(saturation arithmetic)方式处理溢出,在这一模式下,向上溢出的整数值将被设置为类型的最大值,而向下溢出的整数值则会被设置为类型的最小值。
·FAIL表示让INCRBY子命令在检测到计算会引发溢出时拒绝执行计算,并返回空值表示计算失败。

在同一个BITFIELD调用中使用多个OVERFLOW子命令

需要注意的是,因为OVERFLOW子命令只会对同一个BITFIELD调用中排在它之后的那些INCRBY子命令产生效果,所以用户必须把OVERFLOW子命令放到它想要影响的INCRBY子命令之前。

BITFIELD命令并没有提供与INCRBY子命令相对应的DECRBY子命令,但是用户可以通过向INCRBY子命令传入负数增量来达到执行减法操作的效果。INCRBY子命令在执行完相应的操作之后会返回整数的当前值作为结果。

# 将mybitmap3偏移量为0处的值增加15BITFIELD mybitmap3 INCRBY u8 0 15# 将mybitmap3索引为1处的值减去10BITFIELD mybitmap3 INCRBY u8 #1 -10

使用位图存储整数的原因
在一般情况下,当用户使用字符串或者散列去存储整数的时候,Redis都会为被存储的整数分配一个long类型的值(通常为32位长或者64位长),并使用对象去包裹这个值,然后再把对象关联到数据库或者散列中。
与此相反,BITFIELD命令允许用户自行指定被存储整数的类型,并且不会使用对象去包裹这些整数,因此当我们想要存储长度比long类型短的整数,并且希望尽可能地减少对象包裹带来的内存消耗时,就可以考虑使用位图来存储整数。

使用字符串命令对位图进行操作

Redis的位图是在字符串基础上实现的,位图键会被看作一个字符串键,因此除了可以使用前面介绍的位图命令对位图执行操作之外,还可以使用字符串命令对位图进行操作

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。