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

简介: 在竞争激烈的就业市场中,面试不仅考察八股文、算法和项目经验,场景题也愈发重要。本文介绍Java面试中的“在线人数统计”问题:面对亿级用户,如何高效统计在线人数。传统数据库方案难以应对频繁的上线下线操作带来的IO压力,而使用Bitmap(位数组)或Redis的Bitmap命令则能有效解决这一问题。通过将每个用户的在线状态映射到位数组中,仅需119.2MB内存即可处理10亿用户,在线人数统计变得简单高效。

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

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

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

场景分析

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

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

解决方案

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

人数统计1.png

  • 维护一个位数组,每一位只能是1或0
  • 每个下标表示具体的数字,该下标位置的数字为1时,表示用户在线。如数组索引下标2333的值为1,表示QQ号2333的用户在线。反之,值为0表示下线
  • 统计在线人数,只需要统计1的个数即可

内存占用分析

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

具体实现

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

命令 功能 示例
SETBIT key offset 1 用户上线(设置对应位为1) SETBIT online_users 10086 1
GETBIT key offset 判断用户是否在线 GETBIT online_users 10086 → 返回1
BITCOUNT key 统计在线总人数 BITCOUNT online_users → 返回当前在线数

小结

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

相关文章
|
算法
面试场景题:如何设计一个抢红包随机算法
本文详细解析了抢红包随机算法的设计与实现,涵盖三种解法:随机分配法、二倍均值法和线段切割法。随机分配法通过逐次随机分配金额确保总额不变,但易导致两极分化;二倍均值法优化了金额分布,使每次抢到的金额更均衡;线段切割法则将总金额视为线段,通过随机切割点生成子金额,手气最佳金额可能更高。代码示例清晰,结果对比直观,为面试中类似算法题提供了全面思路。
2113 16
|
消息中间件 算法 调度
分布式系统学习10:分布式事务
本文是小卷关于分布式系统架构学习系列的第13篇,重点探讨了分布式事务的相关知识。随着业务增长,单体架构拆分为微服务后,传统的本地事务无法满足需求,因此需要引入分布式事务来保证数据一致性。文中详细介绍了分布式事务的必要性、实现方案及其优缺点,包括刚性事务(如2PC、3PC)和柔性事务(如TCC、Saga、本地消息表、MQ事务、最大努力通知)。同时,还介绍了Seata框架作为开源的分布式事务解决方案,提供了多种事务模式,简化了分布式事务的实现。
709 5
|
缓存 监控 NoSQL
场景题:线上接口响应慢,应该如何排查问题?
面试中常见的接口响应慢排查题旨在考察研发人员的系统性解决问题的能力。回答时需结合业务场景(如大促、高峰期),并运用工具(Arthas、SkyWalking等)进行监控告警、链路追踪和日志分析,明确问题范围及原因。具体步骤包括:1. 定位问题(确认单个接口或整体系统、查看APM指标、分析链路和日志);2. 排查网络、中间件及外部依赖(检测延迟、检查Redis、RocketMQ、MySQL等);3. 服务端性能分析(CPU、内存、磁盘IO、JVM调优)。最后提出优化方案,如代码逻辑、数据库、缓存策略及资源扩容等。总结时可结合实际案例,展示完整的排查与优化流程。
2667 4
|
运维 监控 网络协议
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
425 11
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
|
存储 关系型数据库 分布式数据库
【赵渝强老师】HBase的逻辑存储结构
HBase的逻辑存储结构包括命名空间、表和列族。命名空间类似关系型数据库中的数据库,用于逻辑划分和隔离数据;表以RowKey组织数据并按字典序排列,分为多个Region实现分布式存储;列族包含列且无需预先定义,由MemStore缓存写入数据,定期刷新生成Store File。文章通过视频和代码示例详细讲解了各部分的操作与功能。
461 2
|
11月前
|
安全 Windows
系统恢复厂商设置工具,系统备份,系统还原工具推荐
本文介绍了两款系统备份与恢复工具:傲梅一键还原和联想一键恢复。傲梅一键还原支持所有电脑,通过按F11键快速还原系统,避免重装系统及程序;联想一键恢复则是联想设备专用工具,可恢复出厂设置或自定义备份,适用于Windows 7至Windows 10系统。两者均可有效应对“启动失败”、“找不到操作系统”等常见问题。
477 0
|
机器学习/深度学习 人工智能 自然语言处理
VidSketch:手残党逆袭!浙大AI神器草图秒变4K动画,三连提示词玩转影视级特效
VidSketch 是浙江大学推出的创新视频生成框架,通过手绘草图和简单文本提示生成高质量视频动画,降低视频创作的技术门槛,满足多样化的艺术需求。
579 6
VidSketch:手残党逆袭!浙大AI神器草图秒变4K动画,三连提示词玩转影视级特效
|
API
vue3知识点:shallowReactive 与 shallowRef
vue3知识点:shallowReactive 与 shallowRef
269 2