Redis中的bitmap是什么

技术Redis中的bitmap是什么本篇内容主要讲解“Redis中的bitmap是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis中的bitmap是什么”吧!Re

本文主要讲解“什么是Redis中的位图”。感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你学习“Redis中的位图是什么”!

Redis中的bitmap是什么

Redis的位图是多个二进制位的数组,数组中的每个二进制位都有对应的偏移量(从0开始),通过该偏移量可以对位图中指定的一个或多个二进制位进行操作。

实际上,位图并不是Redis提供的新数据类型,而是字符串类型的扩展。因此,位图命令可以直接用在字符串类型的键上,位图命令操作的键也可以用字符串类型的命令操作。

例如,有一个字符串键foo:

redissetfoobar1的1个字节由8个二进制位组成,因此foo键的二进制形式为:

Redis中的bitmap是什么

00-1010使用SETBIT命令,可以指定位图偏移量的二进制位设置值。偏移量必须大于或等于0,并且该值只能是0或1。这个命令的时间复杂度是O(1)。

SETBIT键偏移值

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

现在,如果你想把bar变成aar,你只需要以下两个步骤:

redissetbitfoo60

(整数)1

redissetbitfoo71

(整数)0

Redisgetfoo’aar ‘当执行SETBIT命令试图设置位图时,如果位图不存在或无法满足位图的当前大小,redis将扩展设置的位图并将所有未设置的二进制位的值初始化为0。例如:

Redissetbitfar101因为far不存在,Redis会将0~9的二进制位设置为0。因为redis以字节为单位展开位图,所以far中实际上有16个二进制位,而不是10个,11~15的二进制位也是0。

基于这种情况,当指定的二进制位偏移量过大时,Redis需要一次性分配所有内存,这可能会导致Redis服务器阻塞。比如存储用户性别,1代表男,0代表女,ID作为二进制偏移量。如果ID从100000000001开始,需要先从用户ID中减去100000000再存储,否则会造成内存浪费。

SETBIT

使用GETBIT命令获取位图指定偏移量处的二进制位的值。这个命令的时间复杂度是O(1)。

GETBIT键偏移量

如果输入偏移量超过位图当前的最大偏移量,结果将返回0。

00-1010 BITCOUNT命令可用于计算位图中值为1的二进制位数。这个命令的时间复杂度是O(n)。

BITCOUNT键[开始结束]

默认情况下,BITCOUNT命令对位图中包含的所有字节中的二进制位进行计数,或者您可以使用可选的start参数和end参数使BITCOUNT只对指定字节范围内的二进制位进行计数(而不是二进制偏移量)。例如,您想要计算ar的两个字节中值为1的二进制数:

redisbitcountfoo12

(整数)7开始和结束参数也支持负索引的使用,下面的用法与上面的等价:

oolbar:false;”>redis> bitcount foo -2 -1
(integer) 7

BITPOS

通过执行 BITPOS 命令,在位图中查找第一个被设置为指定值的二进制位,并返回这个二进制位的偏移量。

BITPOS key value [start end]

BITPOS 也接受可选的 start 参数和 end 参数,让 BITPOS 命令只在指定字节范围内的二进制位中进行查找。

redis> get foo"aar"redis> bitpos foo 1
(integer) 1
redis> bitpos foo 0
(integer) 0
redis> bitpos foo 0 1 2
(integer) 8
redis> bitpos foo 1 1 2
(integer) 9
redis> bitpos foo 1 -1 -1
(integer) 17

针对边界的处理:

  • 当尝试对一个不存在的位图或者一个所有位都被设置成了 0 的位图中查找值为 1 的二进制位时,BITPOS 命令将返回 -1 作为结果。

  • 如果在一个所有位都被设置成 1 的位图中查找值为 0 的二进制位,那么 BITPOS 命令将返回位图最大偏移量加上 1 作为结果

BITOP

通过 BITOP 命令,对一个或多个位图执行指定的二进制位运算,并将运算结果存储到指定的键中。

BITOP operation destkey key [key ...]

operation 参数的值可以是 AND、OR、XOR、NOT 中的任意一个,这 4 个值分别对应逻辑并、逻辑或、逻辑异或和逻辑非 4 种运算,其中 AND、OR、XOR 这 3 种运算允许用户使用任意数量的位图作为输入,而 NOT 运算只允许使用一个位图作为输入。BITOP 命令在将计算结果存储到指定键中之后,会返回被存储位图的字节长度。

当 BITOP 命令在对两个长度不同的位图执行运算时,会将长度较短的那个位图中不存在的二进制位的值看作 0。

redis> set foo1 bar
OK
redis> set foo2 aar
OK
redis> bitop or res foo1 foo2
(integer) 3
redis> get res"car"

Redis中的bitmap是什么

注意:BITOP 可能是一个缓慢的命令,它的时间复杂度是 O(N),在处理长字符串时应注意一下效率问题。

应用场景

用户行为记录器

用用户 ID 作为偏移量,若用户做了某种行为则通过 SETBIT 将二进制位设置为 1,通过 GETBIT 判断用户是否做了某种行为,通过 BITCOUNT 可以知道有多少用户执行了行为。

用户上线统计

可以使用 SETBIT 和 BITCOUNT 来实现,以用户 ID 作为 key ,假设今天是上线统计功能开放的第一天,ID 为 1 的用户上线后就通过 SETBIT 1 0 1。当要计算此用户的总共以来的上线次数时,使用 BITCOUNT 命令就可以得出的结果。

使用这种方式存储数据,即使 10 年后,1个用户就只占用几百字节的内存,它的处理速度依然很快。如果 bitmap 数据比较大,建议将 bitmap 拆分成多个小的 bitmap 分别进行处理。

到此,相信大家对“Redis中的bitmap是什么”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/132965.html

(0)

相关推荐

  • pl什么意思,JM们,我到底PL了没啊?

    技术pl什么意思,JM们,我到底PL了没啊?我10月份做的造影,当时是备孕十一个月都没有好孕,去医院做了所有检查,除了造影,以前听说造影痛苦一直不敢做,医生也不建议我做,说是备孕时间短,后来等所有检查结果出来一切都没问题

    生活 2021年10月27日
  • Oracle GoldenGate配置参数分析

    技术Oracle GoldenGate配置参数分析这篇文章主要介绍“Oracle GoldenGate配置参数分析”,在日常操作中,相信很多人在Oracle GoldenGate配置参数分析问题上存在疑惑,小编查阅了各式

    攻略 2021年11月15日
  • m是什么,“S”和“M”是什么意思

    技术m是什么,“S”和“M”是什么意思S是施虐症:指中世纪法国一个侯爵叫做萨德m是什么,他在生活中喜欢对女性施加虐待,在他的作品中有大量性变态行为的描述,所以后来的学者把主动的虐待症,也就是喜欢虐待别人,命名为萨德现象(

    生活 2021年10月23日
  • 排山倒海的倒的意思,排山倒海形常用来形容什么

    技术排山倒海的倒的意思,排山倒海形常用来形容什么排山倒海这个词语常用来形容力量强盛,声势浩大排山倒海的倒的意思。【出自】:宋·杨万里《六月二十四日病起喜雨》:“病势初来敌颇强,排山倒海也难当。”
    【解释】:初来对抗很强势

    生活 2021年10月27日
  • 电烤箱品牌,什么牌子的家用烤箱比较好

    技术电烤箱品牌,什么牌子的家用烤箱比较好大家好,我是Jessica,是一位爱美食、爱分享的美食博主电烤箱品牌。
    家用烤箱有些人为了省空间,追求比较小的。但是我不推荐!
    因为,烤箱容量太小,容易受热不均匀,对烤出的东西有很

    生活 2021年10月26日
  • Mybatis,二)

    技术Mybatis,二) Mybatis(二)Mybatis(二)三、优化 Mybatis 配置
    我们已经在之前的学习中,学会了如何编写一个简单的 Mybatis 项目。很显然这还远远没有正真了解 My

    礼包 2021年11月26日