如何基于 BitMap 来作为底层的数据模型

本文介绍了如何基于BitMap数据结构解决大数据分析中的高效查询问题。作者通过实例展示了传统SQL查询在大数据量下的性能瓶颈,然后探讨了数据分层、预聚合等方法,最终提出使用BitMap进行数据存储,以实现灵活的维度和指标组合,提高查询效率。此外,还讨论了多维度交叉问题的解决方案和性能对比,强调了BitMap在存储和计算上的优势。
摘要由CSDN通过智能技术生成

作者:陈凯
GrowingIO 数据开发工程师,主要负责 SaaS 和 OP 产品数据平台的开发和设计,目前专攻于微服务、数仓建设方向。

GrowingIO 每天需要处理近千亿的用户行为数据,平台的「事件分析」模块是使用比较频繁的功能,简单且强大。在事件分析中,客户可以很灵活地使用多种维度组合去查看某个指标,并且查询的速度也十分可观。

本文抽取 GrowingIO 在事件分析中的通用数据模型,揭晓该功能背后的存储模型和实现原理。

在用户行为的数据分析中,无论是无埋点,还是埋点,对于某一条行为数据的表达形式往往是:「某人」于「某个时间」在「某个维度」下做了「某个动作」「多少次」。

所以在数据统计中,这种表达形式可以拆解成「指标量」和「维度」,指标量可以是用户量、页面浏览量、某个埋点的次数等,维度可以是时间、城市、浏览器、用户属性等。

在海量数据的背景下,如何比较高效地完成指标+维度的计算,一直是大数据分析领域比较热门的话题,下面将讲述在 GrowingIO ,我们是如何高效解决的。

1. 从一个数据需求说起📈

假设给定如下一组用户行为的原始数据:数据含义: 表示某个用户的某次访问记录。(这里仅列举了地区和设备维度,当然还会存在浏览器、平台、版本等维度,这里不一一列举了。)

1.1 使用 SQL 分析统计

🤔 现在业务想计算「过去7天」在「地区」维度下,「设备: Mac」的人数是多少?So Easy,一个 SQL 搞定在这里插入图片描述

使用 GrowingIO 平台的分析工具可以表示如下:
在这里插入图片描述

但是通过 SQL 这种现查的方式,随着数据量的越来越大,几十亿或上百亿的时候,对计算所需要的资源和响应时间也会线性地增长,此时客户在使用平台工具最直观的感受就是“菊花”转转转,图表一直加载不出来。

1.2 如何使查询更加高效

1.2.1 堆机器,加资源

最直接粗暴的方式,就是增加更多的计算资源,或者对查询的结果进行缓存、预热。但是对于 SaaS 产品来讲,在查询并发比较高的时候,再多的计算资源也会因为查询排队而遇到性能瓶颈。

1.2.2 数据分层

😼 在数仓的分层架构中,对于经常使用的查询结果,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis的bitmap底层数据结构是一个由二进制位组成的字符串,每个二进制位只能是0或1。这个字符串的长度是固定的,即在创建bitmap时就确定了。每个二进制位代表一个数字,这个数字的值就是这个二进制位所在的位置。例如,第0位代表数字0,第1位代表数字1,以此类推。当某个数字被设置为1时,对应的二进制位就被置为1;当某个数字被设置为0时,对应的二进制位就被置为0。这样,我们就可以用bitmap来表示一个数字集合,其中每个数字的出现与否可以用对应的二进制位来表示。 ### 回答2: Redis是一个高性能的非关系型数据库,它支持各种数据结构,包括字符串、哈希表、列表、集合、有序集合等。Bitmap是Redis的其中一个数据结构,它通常用于处理大量的位数据。 Bitmap底层数据结构是一个比特数组,具体来说,Redis使用一个字符串来表示一个Bitmap,每个字符占8个比特位。对于一个大小为N的Bitmap,字符串的长度为(N+7)/8个字符。 Bitmap数据结构支持多种操作,包括位的设置、清除、翻转、计数和位图操作等。 位的设置和清除是Bitmap最基本的操作。设置操作可以将一个比特位设置为1,而清除操作则可以将一个比特位清零。翻转操作可以将一个比特位从0变成1,或从1变成0。 计数操作可以统计一个Bitmap中1的数量,这个操作对于处理海量数据特别有用,比如计算用户在某个时间段内的访问量,可以通过Bitmap记录每个时间点的访问次数,然后对这些Bitmap进行OR运算,即可得到用户在这个时间段内的总访问量。 位图操作则是Bitmap的最大特点。通过位图操作,可以快速地实现各种集合操作,比如交集、并集、差集、子集判断等。比如,可以将两个Bitmap进行OR运算,得到它们的并集,将两个Bitmap进行AND运算,得到它们的交集,将一个Bitmap与另一个非Bitmap进行AND NOT运算,得到它们的差集。 总之,Redis的Bitmap底层数据结构是一个比特数组,通过各种操作可以方便地处理海量的位数据,并实现各种集合操作。这个数据结构可以在很多应用场景下发挥重要作用,包括计数器、高效查询、排重、统计等。 ### 回答3: Redis的bitmap是一种用于处理位操作的数据结构,它可以将一个位序列指定为一个字符串,并提供了许多位操作的命令。Redis中bitmap底层数据结构是一个二进制字符串,也就是一个由0和1组成的长字符串。 在位图中,每个位都代表了一个二进制数字的一个位(0或1)。这样,我们可以通过对位置进行位操作来表示一个数据的状态,比如用位表示是否某一用户访问过某一网站。Redis的bitmap存储方式是将多个二进制字符串连成一个大的字符串,形成bitmap。 特别值得注意的是,由于Redis中的字符串结构支持动态变长,因此可以根据需要来调整动态字符串的长度,这在实际应用中非常灵活和方便。 除此之外,Redis中bitmap的操作也非常丰富,主要包括设置、获取和清除某一位的状态、计数二进制字符串中位值为1的个数、计算多个二进制字符串的位与、位或和位异或等操作。这些操作对于一些需要高效处理二进制数据的应用场景非常有帮助。 总结起来,Redis的bitmap底层数据结构就是一个由0和1组成的二进制字符串,通过一些位操作命令来实现对于二进制字符串的一些设置、获取和计算操作。而在实际应用中,位图可以方便地处理各种二进制数据问题,并且具有高效、灵活等特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值