亿级数据怎么统计?
2023-03-15 23:22:53 时间
在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合。
常见的场景如下:
- 给一个 userId ,判断用户登陆状态;
- 显示用户某个月的签到次数和首次签到时间;
- 两亿用户最近 7 天的签到情况,统计 7 天内连续签到的用户总数;
通常情况下,我们面临的用户数量以及访问量都是巨大的,比如百万、千万级别的用户数量,或者千万级别、甚至亿级别的访问信息。
所以,我们必须要选择能够非常高效地统计大量数据(例如亿级)的集合类型。
如何选择合适的数据集合,我们首先要了解常用的统计模式,并运用合理的数据类型来解决实际问题。
操作指令表示将 三个 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。在统计海量数据的时候将大大减少内存占用。
相关文章
- SQL | 一定要搞懂这些MySQL优化技巧
- Spring中事务的使用、抽象机制及模拟Spring事务实现
- 从零搭建Spring Boot脚手架:整合Redis作为缓存
- 详解 Redis 内存管理机制和实现
- 什么是SQL?我们应该学习哪种数据库系统?
- Redis开篇与如何安装单机版Redis,这次我会了!!
- 为什么我的Redis这么“慢”?
- 迁移到MySQL的语法转换工具初步设计
- 我以为我对MySQL事务很熟,直到我遇到了阿里面试官
- 基于Maxwell的MySQL数据传输服务整体设计
- 11个超实用的数据表单设计技巧,快来收藏!
- 上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB
- 带你轻松迁移数据库到亚马逊云科技
- 一口气说出4种 “附近的人” 实现方式,面试官笑了
- 搞懂这些SQL优化技巧,面试横着走
- 记一次 MySQL 主从双写导致的数据丢失问题
- 手把手教你给 SQL 做个优化
- 想通过数据科学面试,这十个SQL概念你必须掌握
- 为什么我使用了索引,查询还是慢?
- 为什么数据库迁移如此复杂?