写点什么

场景题:10 亿 QQ 用户,如何统计在线人数?

作者:卷福同学
  • 2025-03-05
    湖北
  • 本文字数:585 字

    阅读完需:约 2 分钟

现在卷的环境下,面试除了八股文+算法+项目外,场景题也是问的越来越多了。一方面是就业市场竞争者较多所带来的必然结果;另一方面是公司对于应聘者的技术要求也越来越高了。


今天继续介绍 Java 面试常见的场景题:在线人数统计


现在用户数量是亿级,如何统计在线人数有多少?

场景分析

QQ 用户就是亿级的场景,我们如果使用常规的数据库解决方案是不能满足要求的。例如:在数据库中给每个 QQ 用户添加一个状态,上线为 1,下线为 0,然后统计状态为 1 的数据总量,就能获取在线人数了。


但是,大规模用户频繁上、下线操作,频繁读写数据库,带来巨大 IO 压力,数据库并不能满足性能要求。

解决方案

使用 Bitmap(位数组)来存储 QQ 用户的在线状态,这里还是简单介绍下 Bitmap 的数据结构



  • 维护一个位数组,每一位只能是 1 或 0

  • 每个下标表示具体的数字,该下标位置的数字为 1 时,表示用户在线。如数组索引下标 2333 的值为 1,表示 QQ 号 2333 的用户在线。反之,值为 0 表示下线

  • 统计在线人数,只需要统计 1 的个数即可

内存占用分析

10 亿 QQ 号,位数组的空间位是 10 亿,占用内存大小为:10 亿 * 1bit / 8 / 1024 / 1024 = 119.2MB,分析得出占用的内存非常小

具体实现

上一篇写了 java 的 BitMap 结构,这一篇换换口味,我们用 Redis 提供的 Bitmap 命令来实现


BITCOUNT key 统计在线总人数 BITCOUNT online_users → 返回当前在线数

小结

类似的面试场景题还有很多,最近准备收集一波做成专栏,敬请期待吧~

发布于: 刚刚阅读数: 4
用户头像

卷福同学

关注

一个在福报厂修福报的程序员 2020-04-30 加入

阿里巴巴Java资深开发,终身学习者,持续文章撰写者,福报厂卷着。目前主要从事地图领域相关业务,负责100万QPS的系统,有丰富的高并发高可用经验

评论

发布
暂无评论
场景题:10亿QQ用户,如何统计在线人数?_Java_卷福同学_InfoQ写作社区