后台在线用户统计实现:让系统“看得见”真实流量

公司官网最近搞促销,客服突然反馈说页面卡得不行,一查服务器负载飙到90%以上。可奇怪的是,访问日志显示的PV(页面浏览量)并不高,这说明有大量用户在后台挂着没操作,但系统资源却被悄悄占着。这时候,一个简单的在线用户统计功能就能帮上大忙。

为什么需要在线用户统计

很多网站只关注点击量和注册数,却忽略了“实时活跃”这个关键指标。比如论坛、后台管理系统、在线教育平台,用户登录后可能长时间停留在某个页面,虽然不产生新请求,但会占用会话资源。如果缺乏监控,容易导致内存溢出或响应变慢。

常见实现方式:基于会话心跳

最实用的方法是利用前端定时上报+后端缓存清理机制。用户登录后,前端每隔30秒发送一次心跳请求,后端更新该用户的最后活跃时间。同时设置一个过期阈值(比如2分钟),超过时间未收到心跳的视为离线。

// 前端定时上报示例(JavaScript)
setInterval(() => {
  fetch('/api/heartbeat', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userId: 12345 })
  });
}, 30000); // 每30秒上报一次

后端如何存储和查询

用Redis这类内存数据库最合适。把用户ID作为key,时间戳作为value,写入时设置TTL自动过期。要查当前在线人数,直接获取所有未过期的key数量即可。

# Redis 存储结构示例
SET user:12345 "1717887654" EX 120 # 有效期120秒

# 查询当前在线总数
KEYS user:*  # 生产环境建议用SCAN避免阻塞

别忘了处理异常退出

用户直接关浏览器或断网不会触发登出,所以不能依赖logout事件。心跳机制天然解决了这个问题——只要停了上报,系统自动判定为离线。另外可以在页面卸载前加个beforeunload事件做最后一次确认,提升精度。

展示给管理员看的数据面板

把统计结果做成实时折线图,接进运维监控系统。比如Grafana配Prometheus,或者自己用ECharts画个简单图表。某电商后台接入后发现,每天晚上8点在线峰值比PV峰值高出近40%,这才意识到大量用户在比价页面挂单未支付,及时优化了订单锁定逻辑。

这种轻量级统计不需要复杂架构,几行代码就能上线。关键是把“在线”定义清楚:是登录就算?还是必须有交互动作?根据业务场景定规则,才能反映真实情况。