现在卷的环境下,面试除了八股文+算法+项目外,场景题也是问的越来越多了。一方面是就业市场竞争者较多所带来的必然结果;另一方面是公司对于应聘者的技术要求也越来越高了。
今天继续介绍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 → 返回当前在线数 |
小结
类似的面试场景题还有很多,最近准备收集一波做成专栏,敬请期待吧~
分类:
小白晋级大师之路
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
2023-03-05 【奶奶看了都会】ChatGPT3.5接入企业微信,可连续对话