首页 > 其他分享 >在线人数统计功能怎么实现?

在线人数统计功能怎么实现?

时间:2024-04-10 19:45:26浏览次数:20  
标签:在线 用户 有序 集合 inf now 人数 统计

一、前言

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

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

二、实现步骤

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

认定用户在线的条件一般跟网站有关,如果网站需要登录才能进入,那么这种网站就是根据用户的token令牌有效性判断是否在线;
如果网站是公开的,是那种不需要登录就可以浏览的,那么这种网站一般就需要自定一个规则来识别用户,也有很多方式实现如IPdeviceId浏览器指纹,推荐使用浏览器指纹的方式实现。

浏览器指纹可能包括以下信息的组合:用户代理字符串 (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,然后对这个集合进行增删改查,实现起来还是比较巧妙和简单的,大家有兴趣可以试试看。

标签:在线,用户,有序,集合,inf,now,人数,统计
From: https://www.cnblogs.com/wlovet/p/18126425

相关文章

  • 如何看待语音翻译在线翻译器?探索实时翻译的表现
    大家出门在外,相信多多少少都曾有机会体验与外国人交流,只是语言障碍让沟通变得不是那么顺利。好在还有语音翻译功能可以帮忙。这个功能还是很方便的,就比如你在国外旅行遇到当地人时,只需打开手机,启动语音翻译功能,即可实现翻译,从而畅快交流。这种便捷的体验,让人们更加愿意探索世......
  • P8661 [蓝桥杯 2018 省 B] 日志统计 题解
    好久没写题解了,水一篇。这里主要想讲的是不同的处理方法,在阅读本篇题解前请确保读完题。详解一,排序这很好理解,题目要求将热帖从小到大输出,同时题目中还有相对的时间这一概念,因此将输入的\(id\)与\(ts\)按照优先\(id\)其次\(ts\)的排序方式从小到大,排序,这样输出时就没......
  • ofd在线预览的实现
    ofdViewhttps://gitee.com/fightingYouth/ofd-view首先感谢ofd.js作者,作者是伟大的,开源了ofd的在线预览,解决了我工作中的大问题感兴趣的可以去开一下原作者的 输入链接说明https://gitee.com/Donal/ofd.js?_from=gitee_search介绍本来想做开源呢,但是有其他开发者说让我做个......
  • 遥感降水、气温数据的处理与可视化、ERA5大气再分析数据的统计分析、干旱监测及SCI论
    深度探讨人工智能在大气科学中的应用,特别是如何结合最新AI模型与Python技术处理和分析气候数据。课程介绍包括GPT-4等先进AI工具,旨在帮助学员掌握这些工具的功能及应用范围。内容覆盖使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等实战案例,使学员能够将AI技术广泛应......
  • 让 GitHub 仓库的代码占比统计中包含 Markdown 文件 开发 Git 命令行 个人知识管理 知
    tags:网站/GitHub开发/Git命令行/git个人知识管理/知识库知识领域/文档工程让GitHub仓库的代码占比统计中包含Markdown文件GitHub是一个基于web的版本控制和协作平台,主要用于存储、管理和分享开源代码和项目。它支持Git作为唯一的版本库格式,使得多个开发者可......
  • 基于SSM+MySql+Layui的在线教育视频课程管理系统(附论文)
    演示视频基于SSM+MySql+Layui的在线教育视频课程管理系统(附论文)-源码乐园技术描述开发工具:Idea/Eclipse数据库:mysqlJar包仓库:Maven前段框架:LayUI后端框架:Spring+SpringMVC+Mybatis+MySQL文字描述基于SSM+MySql+Layui的在线教育视频课程管理系统,分为用......
  • P2241 统计方形(数据加强版)
    P2241统计方形(数据加强版)题目有一个\(n\timesm\)方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。输入一行,两个正整数\(n,m\)(\(n\le5000,m\le5000\))。输出一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。样例输入23输出810思......
  • 别再上当受骗,使用身份证真伪在线核验工具!
      随着网络的普及和互联网时代的来临,网络诈骗也日益猖獗。其中,冒用他人身份证信息进行诈骗是一种常见的手段。很多人因为不知道如何辨别身份证的真伪,而陷入骗局。为了帮助大家更好地保护自己的财产安全,现在有一种身份证真伪在线核验工具,让我们能够轻松辨别身份证的真伪,避免上......
  • 【独立版】手边酒店多商户版V2小程序源码部署在线更新SAAS坑位账号
    手边酒店多商户版V2小程序源码:解锁便捷酒店预订新体验在快节奏的现代生活中,我们总是追求更高效、更便捷的生活方式。手边酒店多商户版V2小程序源码,正是为了满足这一需求而诞生的创新之作。这款小程序源码,汇聚了众多酒店商户资源,为用户提供了一个集中、便捷的酒店预订平台。无......
  • Vue2 + Spring Boot的题库管理和在线考试系统
    一个demo从0到1的搭建~使用mybatisplus快速开发springboot项目(一)--初始化-CSDN博客使用mybatisplus快速开发springboot项目(二)--业务实现_如何用mybatis-plus写业务-CSDN博客使用mybatisplus快速开发springboot项目(三)--JWT拦截器-CSDN博客使用mybatisplus快速开发springboot......