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

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

公众号新闻

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7356065093060427816


一、前言

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

核心方法是这四个:zaddzrangeByScorezremrangeByScorezrem

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

二、实现步骤

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中的记录,确保主动退出的用户下线。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

三、小结一下

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


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
Java线程池的实现原理及其在业务中的最佳实践外出吃饭 如何优雅地和朋友AA?华女写书传授餐厅礼仪如何优雅地跟亲戚介绍留子野鸡大学?谈谈优雅的钩子--bpftrace“就像下水道的老鼠一样!”南加蒙市走线人起居状况曝光;太惨了!南加蒙市一华女被撞飞数米,司机却肇事逃走了...如何优雅的将设计模式运用到实际项目中去?在线人数达去年2.4倍!《剑网3》端手互通创新高,玩家:排队离大谱美股基本面 - 2024_03_25 * 晨报 * 台积电盘前涨近1% 消息称其2nm制程加速安装设备 预计2025年量产。日10+AI 系列专题,拆解从 0 到 1 构建大模型架构平台的实现路径|ArchSummit(原创)脱胎梦蓝不亦乐乎——烛影摇红·相遇同舟乡渡优雅的处理 API 接口敏感数据加解密(方案详解)当新中式遇上玛丽珍,国风女鞋复古优雅的美谁懂多伦多又一批中餐关门!统计局公布惊人数据:惨迎“全民节俭时代”维州一线人员严重短缺,仍有数千人因不接种被拒上班中国偷渡客爆涨50倍 -移民梦变噩梦:美国遣返中国走线人 加拿大4成新移民"逃离潮"大厦的奢华生活,城市魅力与现代优雅的完美融合!这身【刺绣镂空衬衫+卡其色休闲裤】,简直是为优雅的职场女性量身定做!急!急!急!在曼哈顿出门突然内急,应该如何优雅地上厕所?附纽约45个公厕地点43、长篇家庭伦理小说《嫁接 下》第十四章 缘起缘灭(4)“减肥神药”影响性功能?药厂回应;理想汽车被曝召回部分被裁员工丨大公司动态CVPR 2024 | 借助神经结构光,浙大实现动态三维现象的实时采集重建熵泱——第五十二章暑假规划强推!等了10年我蕞向往的课程,居然真的实现了如何优雅的跟亲戚介绍留子野鸡大学【科学中的统计】1. 描述性统计简介:使用均值、中位数、标准差个人感慨之122 谁是境外势力?聊聊 13 种锁的实现方式SE发捷报:FF14在线人数创近十年新高,传腾讯正开发FF14手游?文末送书 | 连续25年美国统计类教材排名第一,这本统计学神书中文版来啦!智库访谈丨张永炜:智能物联2.0时代,如何用数字化手段助力“双碳”目标的实现?【高级公寓】The Viridian|Fenway|繁华城市中优雅的家Burning Man生存指南:如何优雅地解决生理需求如何优雅的实现接口统一调用一天只睡4小时,高手如何进化睡眠功能? |【经纬低调分享】泼天富贵!美剧《辐射》带动游戏在线人数暴涨4倍,吸引大批萌新玩家
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。