头条一面:亿级数据怎么统计?

在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合。

常见的场景如下:

  • 给一个 userId ,判断用户登陆状态;

  • 显示用户某个月的签到次数和首次签到时间;

  • 两亿用户最近 7 天的签到情况,统计 7 天内连续签到的用户总数;

通常情况下,我们面临的用户数量以及访问量都是巨大的,比如百万、千万级别的用户数量,或者千万级别、甚至亿级别的访问信息。

所以,我们必须要选择能够非常高效地统计大量数据(例如亿级)的集合类型。

如何选择合适的数据集合,我们首先要了解常用的统计模式,并运用合理的数据类型来解决实际问题。

头条一面:亿级数据怎么统计?_第1张图片

头条一面:亿级数据怎么统计?_第2张图片

头条一面:亿级数据怎么统计?_第3张图片

头条一面:亿级数据怎么统计?_第4张图片

头条一面:亿级数据怎么统计?_第5张图片

头条一面:亿级数据怎么统计?_第6张图片

头条一面:亿级数据怎么统计?_第7张图片

头条一面:亿级数据怎么统计?_第8张图片

头条一面:亿级数据怎么统计?_第9张图片

头条一面:亿级数据怎么统计?_第10张图片

头条一面:亿级数据怎么统计?_第11张图片

头条一面:亿级数据怎么统计?_第12张图片

操作指令表示将 三个 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。在统计海量数据的时候将大大减少内存占用。

cbfe13372a3591f0ee0371289f12e6c6.png

烧脑?放松一下,听下音乐吧

1d48df20789d2e322a4e0a9f465cf82d.png

点击下方

你可能感兴趣的:(java,python,数据库,大数据,数据分析)