当前位置:首页 >> 安全

Redis 实战篇:巧用 Bitmap 借助亿级海量数据统计

来源:安全   2023年04月21日 12:15

8 个 bit 都是由一个 Byte,所以 Bitmap 才会极大地浪费打印生活空间。 这就是 Bitmap 的战术上。

推论软件起航态 ❝

怎么用 Bitmap 来推论核心内容软件之中某个软件前提在线呢?

Bitmap 透过了 GETBIT、SETBIT 操作者,通过一个偏移最大值 offset 对 bit 数据结构的 offset 所在位置的 bit 位完变为读写操作者,能够请注意的是 offset 从 0 开始。

只能够一个 key = login_status 声称打印软件起航长整整可数汇据统计据, 将软件 ID 作为 offset,在线就另设为 1,同步进行另设 0。通过 GETBIT推论相异的软件前提在线。50000 万 软件只能够 6 MB 的生活空间。

SETBIT 擅自

SETBIT

另设或者移去 key 的 value 在 offset 处的 bit 最大值(只能是 0 或者 1)。

GETBIT 擅自

GETBIT

提供 key 的 value 在 offset 处的 bit 位的最大值,当 key 不依赖于时,返国 0。

假如我们要推论 ID = 10086 的软件的起航具体情况:

第一步,监督一般而言解释器,声称软件已受保护。

SETBIT login_status 10086 1

第二步,检查该软件前提起航,返国最大值 1 声称已受保护。

GETBIT login_status 10086

第三步,登成,将 offset 相异的 value 另设变为 0。

SETBIT login_status 10086 0

软件每个年末的分派具体情况

在分派汇总之中,每个软件每天的分派用 1 个 bit 位声称,一年的分派只能够 365 个 bit 位。一个年末最多只有 31 天,只能够 31 个 bit 位即可。

比如汇总编号 89757 的软件在 2021 年 5 年末末的连上具体情况要如何完变为?

key 可以设计变为 uid:sign:{userId}:{yyyyMM},年末末的每一天的最大值 - 1 可以作为 offset(因为 offset 从 0 开始,所以 offset = 日期 - 1)。

第一步,监督上面解释器声称历史纪录软件在 2021 年 5 年末 16 号连上。

SETBIT uid:sign:89757:202105 15 1

第二步,推论编号 89757 软件在 2021 年 5 年末 16 号前提连上。

GETBIT uid:sign:89757:202105 15

第三步,汇总该软件在 5 年末末的连上至多,使用 BITCOUNT 解释器。该解释器用于汇总也就是知道的 bit 数据结构之中,最大值 = 1 的 bit 位的数量。

BITCOUNT uid:sign:89757:202105

这样我们就可以借助软件每个年末的连上具体情况了,是不是很赞。

如何汇总这个年末首次连上整整呢?

Redis 透过了 BITPOS key bitValue [start] [end]解释器,返国汇据统计据声称 Bitmap 之中第一个最大值为 bitValue 的 offset 所在位置。

在默认具体情况下, 擅自将检测整个位图, 软件可以通过可选的 start 参数和 end 参数自行决定要检测的范围。

所以我们可以通过监督一般而言解释器来提供 userID = 89757 在 2021 年 5 年末末首次连上日期:

BITPOS uid:sign:89757:202105 1

能够请注意的是,我们能够将返国的 value + 1 ,因为 offset 从 0 开始。

连续分派软件据统计 ❝

在历史纪录了一个亿的软件连续 7 天的连上汇据统计据,如何汇总成这连续 7 天连续连上软件据统计呢?

我们把每天的日期作为 Bitmap 的 key,userId 作为 offset,若是连上则将 offset 所在位置的 bit 另设变为 1。

key 相异的可数的每个 bit 位的汇据统计据则是一个软件在该日期的连上历史纪录。

合计有 7 个这样的 Bitmap,如果我们能对这 7 个 Bitmap 的相异的 bit 位要用 『与』浮点运算。

同样的 UserID offset 都是一样的,当一个 userID 在 7 个 Bitmap 相异相异的 offset 所在位置的 bit = 1 就知道明该软件 7 天连续连上。

结果保有到一个新 Bitmap 之中,我们再通过 BITCOUNT 汇总 bit = 1 的个数便得到了连续连上 7 天的软件据统计了。

Redis 透过了 BITOP operation destkey key [key ...]这个解释器用于对一个或者多个 配体 = key 的 Bitmap 完变为位元操作者。

opration 可以是 and、OR、NOT、XOR。当 BITOP 执行相异大小的字串时,较短的那个字串所发挥作用的部分才会被比如说 0 。空的 key 也被比如说是包含 0 的字串序列。

便于解读,如下图附注:

BITOP

3 个 Bitmap,相异的 bit 位要用「与」操作者,结果保有到更进一步 Bitmap 之中。

操作者解释器声称将 三个 bitmap 完变为 AND 操作者,并将结果保有到 destmap 之中。接着对 destmap 监督 BITCOUNT 汇总。

// 与操作者

BITOP AND destmap bitmap:01 bitmap:02 bitmap:03

// 汇总 bit 位 = 1 的个数

BITCOUNT destmap

恰当计算下 一个一亿个位的 Bitmap征用的闪存花销,大约九成 12 MB 的闪存(10^8/8/1024/1024),7 天的 Bitmap 的闪存花销约为 84 MB。同时我们最好给 Bitmap 另设停止使用整整,让 Redis 撤下停止使用的连上汇据统计据,浪费闪存。

小结

基本概念才是最重要,当我们遇见的汇总场景只能够汇总汇据统计据的二最大值长整整,比如软件前提依赖于、 ip 前提是黑名单、以及分派连上汇总等场景就可以慎重考虑使用 Bitmap。

只能够一个 bit 位就能声称 0 和 1。在汇总核心内容汇据统计据的时候将大大减少闪存征用。

汕头妇科医院预约挂号
郑州看男科去哪好
北京肛肠医院怎么样
广州比较好的男科医院
艾得辛的成分有哪些
友情链接