news 2026/3/28 3:42:41

如何优雅的实现在线人数统计功能?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何优雅的实现在线人数统计功能?

在线人数统计这个功能相信大家一眼就明白是啥,这个功能不难做,实现的方式也很多,这里说一下我常使用的方式:使用Redis的有序集合(zset)实现。

核心方法是这四个:zaddzrangeByScorezremrangeByScorezrem

二、实现步骤

1. 如何认定用户是否在线?

认定用户在线的条件一般跟网站有关,如果网站需要登录才能进入,那么这种网站就是根据用户的token令牌有效性判断是否在线;

如果网站是公开的,是那种不需要登录就可以浏览的,那么这种网站一般就需要自定一个规则来识别用户,也有很多方式实现如IP、deviceId、浏览器指纹,推荐使用浏览器指纹的方式实现。

浏览器指纹可能包括以下信息的组合:用户代理字符串 (User-Agent string)、HTTP请求头信息、屏幕分辨率和颜色深度、时区和语言设置、浏览器插件详情等。现成的JavaScript库,像FingerprintJSClientJS,可以帮助简化这个过程,因为它们已经实现了收集上述信息并生成唯一标识的算法。

使用起来也很简单,如下:

// 安装:npm install @fingerprintjs/fingerprintjs // 使用示例: import FingerprintJS from '@fingerprintjs/fingerprintjs'; // 初始化指纹JS Library FingerprintJS.load().then(fp => { // 获取访客ID fp.get().then(result => { const visitorId = result.visitorId; console.log(visitorId); }); });

这样就可以获取一个访问公开网站的用户的唯一ID了,当用户访问网站的时候,将这个ID放到访问链接的Cookie或者header中传到后台,后端服务根据这个ID标示用户。

2. zadd命令添加在线用户

1)zadd命令介绍

zadd命令有三个参数

  • key:有序集合的名称。

  • score1、score2 等:分数值,可以是整数值或双精度浮点数。

  • member1、member2 等:要添加到有序集合的成员。

例子:向名为 myzset 的有序集合中添加一个成员:ZADD myzset 1 "one"

2)添加在线用户标识到有序集合中

// expireTime给用户令牌设置了一个过期时间 LocalDateTime expireTime = LocalDateTime.now().plusSeconds(expireTimeout); String expireTimeStr = DateUtil.formatFullTime(expireTime); // 添加用户token到有序集合中 redisService.zadd("user.active", Double.parseDouble(expireTimeStr), userToken);

由于一个用户可能户会重复登录,这就导致userToken也会重复,但为了不重复计算这个用户的访问次数,zadd命令的第二个参数很好的解决了这个问题。

我这里的逻辑是:每次添加一个在线用户时,利用当前时间加上过期时间计算出一个分数,可以有效保证当前用户只会存在一个最新的登录态。

3. zrangeByScore命令查询在线人数

1)zrangeByScore命令介绍

  • key:指定的有序集合的名字。

  • min 和 max:定义了查询的分数范围,也可以是 -inf 和 +inf(分别表示“负无穷大”和“正无穷大”)。

例子:查询分数在 1 到 3之间的所有成员:ZRANGEBYSCORE myzset 1 3

2)查询当前所有的在线用户

// 获取当前的日期 String now = DateUtil.formatFullTime(LocalDateTime.now()); // 查询当前日期到"+inf"之间所有的用户 Set<String> userOnlineStringSet = redisService.zrangeByScore("user.active", now, "+inf");

利用zrangeByScore方法可以查询这个有序集合指定范围内的用户,这个userOnlineStringSet也就是在线用户集,它的size就是在线人数了。

4. zremrangeByScore命令定时清除在线用户

1)zremrangeByScore命令介绍

  • key:指定的有序集合的名字。

  • min 和 max:定义了查询的分数范围,也可以是 -inf 和 +inf(分别表示“负无穷大”和“正无穷大”)。

例子:删除分数在 1 到 3之间的所有成员:ZREMRANGEBYSCORE myzset 1 3

2)定时清除在线用户

// 获取当前的日期 String now = DateUtil.formatFullTime(LocalDateTime.now()); // 清除当前日期到"-inf"之间所有的用户 redisService.zremrangeByScore(""user.active"","-inf", now);

由于有序集合不会自动清理下线的用户,所以这里我们需要写一个定时任务去定时删除下线的用户。

5. zrem命令用户退出登录时删除成员

1)zrem命令介绍

  • key:指定的有序集合的名字。

  • members:需要删除的成员

例子:删除名为xxx的成员:ZREM myzset "xxx"

2)定时清除在线用户

// 删除名为xxx的成员 redisService.zrem("user.active", "xxx");

删除 zset中的记录,确保主动退出的用户下线。

三、小结一下

这种方案的核心逻辑就是,创建一个在线用户身份集合为key,利用用户身份为member,利用过期时间为score,然后对这个集合进行增删改查,实现起来还是比较巧妙和简单的,大家有兴趣可以试试看。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/24 2:14:01

为什么 MyBatis 源码中,没有我那种 if···else

类型&#xff1a;创建型模式工厂模式单例模式建造者模式类型&#xff1a;结构型模式适配器模式代理模式组合模式装饰器模式类型&#xff1a;行为型模式模板模式策略模式迭代器模式总结在MyBatis的两万多行的框架源码中&#xff0c;使用了大量的设计模式对工程架构中的复杂场景进…

作者头像 李华
网站建设 2026/3/20 9:59:25

计算机毕业设计springboot毕业学员志愿填报系统设计与实现 基于SpringBoot的应届毕业生意向院校在线填报平台 SpringBoot框架下的毕业生升学志愿智能采集与录取通知系统

计算机毕业设计springboot毕业学员志愿填报系统设计与实现 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。每到毕业季&#xff0c;纸质志愿表、Excel汇总、人工核分的“老三样”…

作者头像 李华
网站建设 2026/3/13 3:25:01

深度学习毕设项目推荐-基于python-CNN卷积神经网络对蔬菜识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/18 9:08:10

共聚焦显微镜测量材料表面粗糙度的参数探究

随着工业制造精度持续提升&#xff0c;材料的表面粗糙度成为影响产品性能的关键指标。传统接触式测量易损伤材料表面且无法获取三维形貌&#xff0c;难以满足现代检测要求。光子湾科技的共聚焦显微镜具备非接触、高分辨与三维成像优势&#xff0c;可实现快速精确测量。本文以6种…

作者头像 李华
网站建设 2026/3/27 4:23:03

零碳园区商业模式创新的政策支持有哪些?

零碳园区商业模式创新离不开政策的引导与支撑。作为“双碳”目标落地的核心载体&#xff0c;零碳园区建设具有投资规模大、回报周期长、涉及主体多、技术集成复杂等特点&#xff0c;单纯依靠市场自发驱动难以实现规模化推进。近年来&#xff0c;我国从国家到地方层面密集出台一…

作者头像 李华
网站建设 2026/3/28 1:16:24

2026年更新psv用pfba街机模拟器v7.1

PFBA的缺点就是目前帧数不足&#xff0c;不过还好开了跳帧游戏整体速度可以得到保证&#xff0c;不至于拖慢。 优点是BGM居然正常了&#xff0c;PSP的FBA模拟器西游三国的BGM是有严重问题的&#xff0c;爆音模拟错乱&#xff0c;包括安卓上的FBA模拟器PGM基板的声音也有严重问题…

作者头像 李华