Springboot+redis 做实时在线人数统计

  • 介绍
    • 实现

介绍

利用redis 有序集合实现。

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。

zset命令

  1. 新增成员
    zadd:新增成员
  2. 删除成员
    zrem:根据指定key进行删除
    zremrangebylex:根据指定集合区间进行删除
    zremrangebyrank:根据指定排名区间进行删除
    zremrangebyscore:根据分数区间进行删除
  3. 查询成员
    zcard:查询集合成员数量
    zcount:分数区间成员数量
    zlexcount:成员区间成员数量
    zscore:指定key和值,获取分数
    zrange:获取成员信息
    zrank:指定key和值,获取下标
    zrangebylex:指定集合区间,获取列表
    zrangebyscore:指定分数区间,获取列表
    zrevrange:倒序展示列表
    zrevrangebyscore:根据分数区间,倒序展示列表
    zreverank:倒序获取成员下标

最终呈现效果

这里使用的工具是AnotherRedisDesktopManager

实现

因为zset中每个元素都有关联的分数,并且可以通过分数区间查询删除数据,所以我们可以将分数设置为时间戳。
1、后端编写一个用户心跳接口(注意这个接口需要放开权限

/*** 用户心跳保持接口* @param :* @return boolean* @author LuckyDog 19:08 2021/12/10**/@GetMapping("heartbeat")@ResponseBodypublic boolean heartbeat(HttpServletRequest request) {User sessionUser = CommonUtil.getSessionUser(request);if(sessionUser!=null&&sessionUser.getId()!=null&&sessionUser.getId()!=0){fyStatisticsUtil.userOnline(sessionUser.getId());return true;}return false;}

fyStatisticsUtil 一个工具类


import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;/*** @author LuckyDog*/
@Component
public class FyStatisticsUtil {private static final String ONLINE_USER = "online_user";@Resourceprivate FyRedisUtil fyRedisUtil;//region 在线用户统计相关public void userOnline(Long userId) {fyRedisUtil.zsetSet(ONLINE_USER, userId, System.currentTimeMillis());}public Long userOnlineCount() {return fyRedisUtil.zsetCount(ONLINE_USER);}public Long userOfflineClean() {DateTime dateTime = DateTime.now();DateTime offset = dateTime.offset(DateField.MINUTE, -2);return fyRedisUtil.zsetRemove(ONLINE_USER, 0L, offset.getTime());}//endregion
}

fyRedisUtil 部分代码

public Boolean zsetSet(String key, Object value, long score){try {return redisTemplate.opsForZSet().add(key, value, score);}catch (Exception e) {e.printStackTrace();return false;}}public Long zsetCount(String key){try {return redisTemplate.opsForZSet().size(key);}catch (Exception e) {e.printStackTrace();return 0L;}}public Long zsetRemove(String key,Long minScore,Long maxScore){try {return redisTemplate.opsForZSet().removeRangeByScore(key,minScore,maxScore);}catch (Exception e) {e.printStackTrace();return 0L;}}

定时器,定时清理已过期用户数量


/*** @author LuckyDog*/
@Component
@ConditionalOnProperty(prefix = "website", name = "run", havingValue = "analysisTimer")
public class StatisticsTimer {@ResourceFyStatisticsUtil fyStatisticsUtil;@Scheduled(cron = "0 0/2 * * * ?")public void clearOfflineUser() {Long aLong = fyStatisticsUtil.userOfflineClean();System.out.println("清除已过期用户数量:" + aLong);}
}

最后找一个前端页面最外层框架页里,写上一个定时请求心跳接口的js就行了,我这里设置的是一分钟心跳一次

 let timer;$(function(){beat();timer = setInterval("beat()",60000);})function beat(){$.get("/heartbeat",null,function(res){if(!res){clearInterval(timer);}});}

大功告成。这种方案实现的实时在线人数相对来说是比较准确的。只要用户访问网站,每分钟就会心跳一次。每次心跳都会更新redis里面的时间戳。如果用户心跳中断,就意味着用户已经离线。后端也有一个定时器,设置的每两分钟清理一次离线用户。

Springboot+redis 做实时在线人数统计相关推荐

  1. 如何用redis做活跃用户统计-HyperLoglog

    原文在这里: 如何用redis做活跃用户统计-HyperLoglog 网站经常有这样的需求:统计日活用户数,有哪些实现方式呢? 第一种做法:用redis的set集合. 用户登录以后,把用户id添加到r ...

  2. PHP通过Redis做uv/pv统计

    /*** php通过redis做uv/pv统计*/ $redis = new redis(); $dates = date("Y-m-d"); //统计uv 把ip添加入集合,假如 ...

  3. REDIS实践之在线人数统计几种方案分析

    在线人数统计业务是我们开发web肯定要设计的业务逻辑,本文就会给出几种设计方案,来分析下各个方案的优缺点: 使用有序集合 这种方案能够同时储存在线的用户 和 用户上线时间,能够执行非常多的聚合计算,但 ...

  4. SpringBoot-心跳机制+redis实现网站实时在线人数统计

    在社交网站中,通常需要实时统计某个网站的在线人数,通过该指标来实时帮助运营人员更好的维护网站业务: 先说一下目前在市面上主流的做法再加上我自己查阅的资料总结: 创建一个session监听器,在用户登录 ...

  5. 领券中心项目,我是如何用 Redis 做实时订阅推送的?

    作者:浮云骑士LIN 出处:cnblogs.com/linlinismine/p/9214299.html 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心 ...

  6. 我是如何用 Redis 做实时订阅推送的?

    前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了... 其中有一个功能叫做领 ...

  7. 学会这几招,你也可以用 Redis 做实时订阅推送!

    作者:浮云骑士LIN 来源:www.cnblogs.com/linlinismine/p/9214299.html 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下 ...

  8. 如何用 Redis 做实时订阅推送的?

    作者:浮云骑士LIN 链接:https://www.cnblogs.com/linlinismine/p/9214299.html 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落 ...

  9. springboot redis做缓存

    一.配置好redis,不做赘述,只需要连接成功就好,有复杂需求请自行搜索redis 缓存相关策略配置 二.springboot pom引入cache <!-- https://mvnreposi ...

最新文章

  1. win7,windowsXP安装mysql-5.1.49-win32,中文版、英文版,通吃
  2. access vba 常量数组赋值_VBA数组是什么?有何作用?别担心,你只需用1分钟就明白它是什么...
  3. 天天写业务代码?写业务代码中的成长机会!
  4. vuejs构建的单页面应用history模式子页面微信分享在iOS中遇到的问题
  5. LI标签在Ul中居中显示
  6. 第五——十三章的作业
  7. linux 制作box文件夹,用busybox制作自己简易的根文件系统
  8. u-boot移植随笔:困难重重,前路未知
  9. 大数据之-Hadoop3.x_MapReduce_WordCount案例需求分析---大数据之hadoop3.x工作笔记0087
  10. 职场白骨精必看的五个寓言
  11. ai的预览模式切换_当AI频繁切换色彩预览模式时 颜色会越变越深 求解?
  12. 使用 IBM Data Studio 管理数据库最佳实践
  13. dos批处理文件中使用vbs
  14. 响应式布局的实现方式
  15. html5 contenteditable 可编辑属性
  16. 剪切后的文件可以恢复吗?恢复剪切文件怎么办?
  17. php操作 JSON格式数据
  18. ristretto255 point压缩和解压缩算法(1)——affine坐标系下
  19. Linux学习入门-------------------------VMvare与镜像的安装与配置
  20. 大数据组件之HBase

热门文章

  1. 基于图数据库的物联网模型(1)-图数据库与模型设计
  2. macos支持exfat吗_打造便捷、人性化的macOS桌面使用环境
  3. ZZULIOJ:1068: 二进制数
  4. 单片机c语言电梯楼层,基于单片机五层电梯课程设计.pdf
  5. vba和vb的小区别
  6. python数据可视化仪表盘_数据可视化(六)常见的可视化仪表盘(DashBoard)
  7. Matlab:查找要使用的函数
  8. properties中文乱码快速处理
  9. 开机自动拨号,断线重连,并且动态解析dns记录,java版
  10. pcb设计用什么软件?pcb设计常用工具有哪些?