全栈开发
后端基础
【Q363】如何获取当前系统中的在线用户数 (并发用户数)

如何获取当前系统中的在线用户数 (并发用户数)

更多描述 一些 SaaS 系统基于 Pricing 的考虑,会限制团队人数及同时在线数,如何实现

Issue 欢迎在 Gtihub Issue 中回答此问题: Issue 368 (opens in a new tab)

Author 回答者: shfshanyue (opens in a new tab)

一些 SaaS 系统基于定价策略的考虑,会限制团队人数及同时在线数,如何实现?

通过 rediszset 可实现并发用户数。

当一个用户请求任何接口时,实现一个 middleware,处理以下逻辑

// 当一个用户访问任何接口时,对该用户Id,写入 zset
await redis.zadd(
  `Organization:${organizationId}:concurrent`,
  Date.now(),
  `User:${userId}`,
);
 
// 查询当前机构的并发数
// 通过查询一分钟内的活跃用户来确认并发数,如果超过则抛出特定异常
const activeUsers = await redis.zrangebyscore(
  `Organization:${organizationId}:concurrent`,
  Date.now() - 1000 * 60,
  Date.now(),
);
 
// 查出并发数
const count = activeUsers.length;
 
// 删掉过期的用户
await redis.zrembyscore(
  `Organization:${organizationId}:concurrent`,
  Date.now() - 1000 * 60,
  Date.now(),
);

总结

  1. 每当用户访问服务时,把该用户的 ID 写入优先级队列,权重为当前时间
  2. 根据权重(即时间)计算一分钟内该机构的用户数
  3. 删掉一分钟以上过期的用户