首页 > 其他分享 >探寻优雅之法:实现高效在线人数统计功能

探寻优雅之法:实现高效在线人数统计功能

时间:2024-11-18 11:17:11浏览次数:3  
标签:在线 用户 优雅 命令 集合 inf zadd 探寻

探寻优雅之法:实现高效在线人数统计功能

前言

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

实现步骤

如何认定用户是否在线?

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

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

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

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

// 安装: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标示用户。

zadd命令添加在线用户

zadd命令介绍

zadd命令有三个参数

  • key:有序集合的名称。
  • score1、score2 等:分数值,可以是整数值或双精度浮点数。
  • member1、member2 等:要添加到有序集合的成员。

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

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

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

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

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

zrangeByScore命令查询在线人数

zrangeByScore命令介绍

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

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

查询当前所有的在线用户

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

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

zremrangeByScore命令定时清除在线用户

zremrangeByScore命令介绍

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

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

定时清除在线用户

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

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

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

zrem命令介绍

  • key:指定的有序集合的名字。
  • members:需要删除的成员

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

定时清除在线用户

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

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

小结一下

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

标签:在线,用户,优雅,命令,集合,inf,zadd,探寻
From: https://blog.csdn.net/weixin_42081445/article/details/143848331

相关文章

  • 计算机毕业设计在线购物商城超市购物系统日用品商城小商品在线购买网站php+mysql+html
     一.功能介绍用户前台功能:前台主要包括网站首页、今日特卖、限时打折、商品中心、常见问题、我的购物车、登录、注册、商品详情,联系卖家,加入购物车、结算、个人中心等功能模块。今日特卖、限时打折、商品中心模块,用户可以查看全部商品信息,联系卖家、选择商品进行添加购物......
  • php毕业设计购物商城在线购物系统美食购物商城外卖系统点餐系统美食网站php+mysql+htm
    一,功能介绍        前台主要包括网站首页、商品推荐、最新商品、新闻咨询、商品分类、商品资讯、评论、登录、注册、加入购物车、结算、个人中心等功能模块商品推荐、最新商品在商品推荐、最新商品模块,用户可以查看全部商品信息,选择商品进行添加购物车等操作,购物......
  • SpringBoot在线投票数据分析平台研究与设计8kxf0(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着互联网技术的普及,在线投票活动逐渐成为各类组织、企业和个人进行决策和意见收集的重要手段。然而,如何高效地收集、整理和分......
  • SpringBoot在线教育系统a1q7y(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着互联网技术的快速发展,教育领域正经历着前所未有的变革。在线教育系统作为数字化教育的重要载体,以其跨越时空限制、灵活便捷......
  • 基于微信小程序的学生在线投票系统小程序app项目(源码+lw+部署文档+讲解等)
    项目整体介绍基于微信小程序的学生在线投票系统小程序为校园投票活动提供了便捷的解决方案。它具有简洁易用的界面,方便学生快速上手。活动组织者可以轻松创建投票项目,设定投票主题、选项、投票规则,如是否允许多选、投票起止时间等。在投票过程中,系统能实时统计票数,通过直......
  • 腾讯在线文档去掉底色
    现在在线文档在单位使用范围比较广泛,前两天领导给我一个问题,在线文档标黄了部分文字,需要保留格式的情况下把底色去掉。当时在领导电脑上没解决,后面自己弄了个文档来测试解决了。分享给需要的人一个参考。觉得过程麻烦的直接看最后解决方法,前面是过程。1、在线文档导出 2、这......
  • ssm毕设在线学习管理系统程序+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着信息技术的飞速发展,互联网在教育领域的渗透日益加深。传统的学习管理模式面临着诸多挑战,例如教学资源分配不均衡、信息传递效率低下以及学习......
  • HarmonyOS Next 助力在线教育:网络优化实战案例
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在线教育在当今社会中发挥着......
  • 基于vue.js和node.js的在线购物网站设计和实现-毕业设计源码83077
    目 录摘要1绪论1.1研究背景1.2 研究意义1.3论文结构与章节安排2 系统分析2.1可行性分析2.2系统流程分析2.2.1数据新增流程2.2.2 数据删除流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4 系统用例分析3系统总体设计3......
  • CentOS部署雷池WAF:先在线部署,后离线部署
    CentOS部署雷池WAF:先在线部署,后离线部署KaliLinux网络安防使用的是CentOS7操作系统。一、在线安装,并为离线安装做准备1.关闭firewalldsystemctlstopfirewalldsystemctldisablefirewalld2.关闭selinux永久关闭SELinux:修改/etc/selinux/config文件中的SE......