做网站或运营后台系统时,经常需要知道当前有多少用户正在访问。这个数字不是摆设,它直接影响服务器资源调度、用户体验优化甚至安全监控。比如某天晚上突然在线用户从几百飙升到上万,可能是活动爆了,也可能是被攻击了,搞清楚才能及时应对。
为什么需要统计在线用户
很多人觉得“能用就行”,但等页面卡顿、服务器负载飙升才反应过来就晚了。在线用户数是个关键指标,能帮你判断是不是该扩容、有没有异常流量、哪些功能最活跃。电商大促前看这个数据,能提前加机器;社区平台靠它分析用户活跃时段,安排推送时间。
常见实现方式
最直接的办法是记录每个用户的会话(session)。用户登录或首次访问时生成一个会话标识,设置过期时间。只要在有效期内有请求,就认为用户“在线”。定时清理过期会话,剩下的数量就是当前在线人数。
以 Node.js 为例,可以用 Express 和 express-session:
const session = require('express-session');
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
cookie: { maxAge: 30 * 60 * 1000 } // 30分钟无操作视为离线
}));
// 统计当前活跃 session 数量
function getOnlineCount(sessions) {
let count = 0;
const now = Date.now();
for (let sid in sessions) {
if (sessions[sid].cookie.expires > now) {
count++;
}
}
return count;
}
如果是 PHP,$_SESSION 数据通常存在文件或 Redis 中,写个脚本扫描未过期的 session 文件也能估算在线人数。
更精确的做法:心跳机制
单纯依赖 session 有个问题:用户关掉浏览器不退出,session 还在有效期,系统仍算他在线。改进方式是前端每隔一段时间发个“心跳”请求。
比如在网页里加一段 JS:
setInterval(() => {
fetch('/api/heartbeat', { method: 'POST' });
}, 60000); // 每分钟上报一次
后端收到请求就更新该用户最后活跃时间。统计时只计算最近两分钟内有过心跳的用户,数据更真实。
用 Redis 提升效率
当用户量上来后,频繁读写文件或数据库压力大。Redis 是更好的选择,利用它的过期机制自动清理无效数据。
SET user:12345 online EX 120 // 每次用户活动,设置120秒过期
// 统计时用 KEYS user:* 获取所有在线 key 的数量(生产环境建议用 SCAN)
这种方式轻量高效,适合高并发场景。
别忘了排除干扰
有些爬虫、自动化脚本也会触发访问,算进在线人数会失真。可以在统计前判断 User-Agent,或者要求必须携带有效的登录 token 才计入。移动端和网页端分开统计也有意义,便于分析不同终端的使用习惯。
实际应用中,某本地生活平台发现夜间在线用户异常偏高,排查后发现是某个优惠券接口被脚本刷单。通过限制非活跃用户不计入、增加行为验证,很快控制了局面。
在线用户统计不一定要多复杂,关键是及时、准确。根据业务规模选合适的方法,小项目用 session 就够了,中大型系统建议上 Redis + 心跳机制。数据跑起来之后,结合监控告警,才能真正做到心里有数。