极客时间返利平台,你可以在上边通过山月的链接购买课程,并添加我的微信 (shanyue94) 领取返现。

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

更多描述

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

Issue

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

一些 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. 删掉一分钟以上过期的用户
Last Updated: 11/27/2021, 6:11:48 PM