后台在线用户统计实现:让系统实时掌握活跃人数

你有没有遇到过这种情况:公司刚上线了一个内部管理系统,老板突然问:“现在有多少人正在用?”你一脸懵,后台哪能看到这个?其实,实现后台在线用户统计没那么复杂,关键是思路要对。

为什么需要在线用户统计

不只是为了应付老板的临时提问。比如客服系统,知道当前有多少坐席在线,能合理分配任务;比如教育平台,老师想看看有多少学生正在听课,及时互动。这些场景都依赖准确的在线状态判断。

常见的实现方式

最简单的做法是基于用户登录会话。用户登录后,服务器记录 session,只要 session 没过期,就算在线。但问题来了:用户关掉浏览器不点退出,session 还在,系统就以为他还在线,数据不准。

更靠谱的做法是“心跳机制”。前端每隔 30 秒向服务器发一次请求,就像心跳一样,告诉系统“我还活着”。服务器维护一个在线列表,超过 1 分钟没收到心跳的,自动踢出。

代码怎么写

后端可以用 Redis 存储在线用户信息,key 是用户 ID,value 是最后心跳时间。每次收到心跳更新时间:

SET online:user:123 "1717324800" EX 90

这里设置 90 秒过期,确保即使客户端异常断开,也会自动清除。定时任务扫描所有 key,就能统计当前在线人数。

前端配合发送心跳:

setInterval(() => {
  fetch('/api/heartbeat', { method: 'POST' });
}, 30000);

注意别踩坑

别小看这个功能,做不好反而拖慢系统。如果每秒几千个心跳请求,数据库压力山大。可以加个节流,比如用户在页面有操作才触发心跳,或者用 WebSocket 长连接批量上报。

另外,移动端网络不稳定,心跳丢失很正常。可以把判定离线的阈值放宽到 2-3 分钟,避免误判。

上线后拉个图表展示趋势,运维一看就知道高峰时段,提前扩容。这才是真正的效率提升——把模糊的问题变成可量化的数据。