做后台管理或者运营数据分析时,经常会被问到:现在有多少人正在用我们的系统?这个问题看似简单,但真要准确回答,得在web应用里做好在线用户统计。
什么是“在线用户”
这里的“在线”,不是指登录了就算,而是指最近一段时间内有操作行为的用户。比如一个用户打开页面后10分钟没动,通常就不算“活跃在线”。常见做法是把“最近5分钟内有过请求”的用户视为在线。
基础实现:服务端会话跟踪
最简单的办法是在用户每次发起请求时,更新一个服务器端的记录。比如用 Redis 存储每个用户的最后活跃时间:
// 伪代码示例:记录用户最后活跃时间
const userId = req.user.id; // 假设已登录
const now = Date.now();
// 存入 Redis,设置过期时间 5 分钟(300秒)
redis.setex(`online:${userId}`, 300, now);
然后统计所有 online:* 的 key 数量,就能知道当前有多少人在线。这种方法轻量,适合中小型应用。
前端配合心跳机制
如果用户只是开着页面但从不刷新,服务端可能收不到新请求。这时候可以在前端加个定时器,每隔几十秒发一次“心跳”请求:
<script>
// 每30秒上报一次在线状态
setInterval(() => {
fetch('/api/heartbeat', { method: 'POST' });
}, 30 * 1000);
</script>
服务端收到请求后更新该用户的时间戳。注意别太频繁,避免增加无谓负载。
结合 WebSocket 更实时
如果你的应用已经用了 WebSocket 做消息推送,那统计在线用户就更方便了。只要连接建立,就可以认为用户在线;断开就标记为离线。
// WebSocket 连接建立时
wss.on('connection', (ws, req) => {
const userId = getUserIdFromRequest(req);
onlineUsers.add(userId);
ws.on('close', () => {
onlineUsers.delete(userId);
});
});
这种方案实时性强,适合聊天室、协作编辑这类强交互场景。
第三方工具也能快速接入
不想自己搞?可以用现成的服务。比如 Sentry、Mixpanel 或者国内的友盟、神策数据,都能提供在线用户数面板。接入 SDK 后,基本不用写额外逻辑,适合快速验证产品活跃度。
注意隐私和性能
统计可以做,但别过度收集信息。尤其涉及用户标识时,确保符合 GDPR 或《个人信息保护法》要求。另外,高并发下频繁读写 Redis 可能成为瓶颈,建议加个采样或批量更新机制,别让统计功能拖慢主业务。
上线后的某个下午,运营突然跑来问:“今天峰值在线多少人?”你打开 dashboard 看一眼就答上来了——这才是技术该有的样子。