打开一个网站,看到右上角显示“当前在线人数:864”,你有没有好奇这个数字是怎么来的?其实这就是服务器在线用户统计的常见应用场景。无论是论坛、直播平台,还是企业内部系统,掌握实时在线人数对运维和产品优化都很关键。
在线用户的定义
“在线”并不一定意味着用户正在操作。通常,系统会根据用户最近一次与服务器通信的时间来判断是否在线。比如,30秒内有过请求,就认为是在线状态;超过这个时间没有活动,就会被标记为离线。
常见的统计方法
最简单的方式是在服务端维护一个用户状态表。每当用户发起请求,就更新其最后活跃时间。后台定时清理过期记录,剩下的就是当前在线用户。
以 Node.js 为例,可以用一个对象来存储用户信息:
const onlineUsers = {};
// 用户登录或访问时
onlineUsers[userId] = {
lastActive: Date.now(),
ip: userIP
};
// 定时清理超过30秒无活动的用户
setInterval(() => {
const now = Date.now();
for (const id in onlineUsers) {
if (now - onlineUsers[id].lastActive > 30000) {
delete onlineUsers[id];
}
}
}, 5000); // 每5秒检查一次
借助 Redis 实现分布式统计
单机存储在多服务器环境下就不够用了。这时候可以用 Redis 的过期机制来管理在线状态。每次用户活动时,设置一个带 TTL 的键值:
SET online:user:12345 true EX 30
这样,只要用户持续活动,这个键就会被不断刷新。一旦停止请求,30秒后自动过期。统计时只需要用 KEYS online:user:*(生产环境建议用 SCAN)就能拿到当前所有在线用户数。
前端如何展示
后端提供一个接口返回当前数量,前端每隔几秒拉取一次:
fetch('/api/online-count')
.then(res => res.json())
.then(data => {
document.getElementById('count').textContent = data.count;
});
虽然看起来只是个小数字,但它背后涉及状态管理、性能优化和数据一致性。对于运营来说,这个数据能反映流量高峰;对开发来说,是系统负载的重要参考。
下次你看到“当前在线人数”,不妨想想它背后的运行逻辑——这不仅仅是个数字,而是系统实时感知能力的体现。