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

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

今天继续介绍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命令来实现

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

小结

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

相关推荐
北城笑笑1 分钟前
Server 18 ,Nginx 双服务器 HTTP转HTTPS 代理实战( HTTP 地址换 HTTPS 域名 )
运维·服务器·前端·后端·nginx·http·https
紫洋葱hh1 分钟前
Go 入门基础:类型、变量与运算符
开发语言·后端·ai·golang
随性而行3605 分钟前
企业微信API接口开发实战:如何实现消息回调接收与业务事件处理?
java·前端·python·微信·机器人·企业微信
美味蛋炒饭.7 分钟前
java八股面试(3)
java·开发语言·面试
IT研究室10 分钟前
最新计算机毕业设计选题推荐-基于spring boot的美食配送平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
打工仔折腾 AI11 分钟前
Qt网络编程实战:UDP、TCP到HTTP的落地经验与选型
网络·人工智能·后端·python·qt·udp·ai agent 实战
打工仔折腾 AI11 分钟前
SQL 编辑器不是高级记事本:KStudio 与 KSQL Developer 的建表与增删改查手法
数据库·人工智能·后端·python·sql·编辑器·ai agent 实战
霸道流氓气质26 分钟前
Saga模式入门与实战:编排与协同模式、补偿设计原则与Java生产级实现
java·开发语言
考研保研资料分享29 分钟前
2022食品跨申农业工程保研:中农、海大与华工考核复盘
面试
江湖有缘32 分钟前
Docker实战 | 使用Docker部署Readeck书签管理工具
java·docker·eureka