Springboot+redis 做实时在线人数统计
Springboot+redis 做实时在线人数统计
- 介绍
- 实现
介绍
利用redis 有序集合实现。
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。
zset命令
- 新增成员
zadd:新增成员 - 删除成员
zrem:根据指定key进行删除
zremrangebylex:根据指定集合区间进行删除
zremrangebyrank:根据指定排名区间进行删除
zremrangebyscore:根据分数区间进行删除 - 查询成员
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 做实时在线人数统计相关推荐
- 如何用redis做活跃用户统计-HyperLoglog
原文在这里: 如何用redis做活跃用户统计-HyperLoglog 网站经常有这样的需求:统计日活用户数,有哪些实现方式呢? 第一种做法:用redis的set集合. 用户登录以后,把用户id添加到r ...
- PHP通过Redis做uv/pv统计
/*** php通过redis做uv/pv统计*/ $redis = new redis(); $dates = date("Y-m-d"); //统计uv 把ip添加入集合,假如 ...
- REDIS实践之在线人数统计几种方案分析
在线人数统计业务是我们开发web肯定要设计的业务逻辑,本文就会给出几种设计方案,来分析下各个方案的优缺点: 使用有序集合 这种方案能够同时储存在线的用户 和 用户上线时间,能够执行非常多的聚合计算,但 ...
- SpringBoot-心跳机制+redis实现网站实时在线人数统计
在社交网站中,通常需要实时统计某个网站的在线人数,通过该指标来实时帮助运营人员更好的维护网站业务: 先说一下目前在市面上主流的做法再加上我自己查阅的资料总结: 创建一个session监听器,在用户登录 ...
- 领券中心项目,我是如何用 Redis 做实时订阅推送的?
作者:浮云骑士LIN 出处:cnblogs.com/linlinismine/p/9214299.html 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心 ...
- 我是如何用 Redis 做实时订阅推送的?
前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了... 其中有一个功能叫做领 ...
- 学会这几招,你也可以用 Redis 做实时订阅推送!
作者:浮云骑士LIN 来源:www.cnblogs.com/linlinismine/p/9214299.html 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下 ...
- 如何用 Redis 做实时订阅推送的?
作者:浮云骑士LIN 链接:https://www.cnblogs.com/linlinismine/p/9214299.html 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落 ...
- springboot redis做缓存
一.配置好redis,不做赘述,只需要连接成功就好,有复杂需求请自行搜索redis 缓存相关策略配置 二.springboot pom引入cache <!-- https://mvnreposi ...
最新文章
- win7,windowsXP安装mysql-5.1.49-win32,中文版、英文版,通吃
- access vba 常量数组赋值_VBA数组是什么?有何作用?别担心,你只需用1分钟就明白它是什么...
- 天天写业务代码?写业务代码中的成长机会!
- vuejs构建的单页面应用history模式子页面微信分享在iOS中遇到的问题
- LI标签在Ul中居中显示
- 第五——十三章的作业
- linux 制作box文件夹,用busybox制作自己简易的根文件系统
- u-boot移植随笔:困难重重,前路未知
- 大数据之-Hadoop3.x_MapReduce_WordCount案例需求分析---大数据之hadoop3.x工作笔记0087
- 职场白骨精必看的五个寓言
- ai的预览模式切换_当AI频繁切换色彩预览模式时 颜色会越变越深 求解?
- 使用 IBM Data Studio 管理数据库最佳实践
- dos批处理文件中使用vbs
- 响应式布局的实现方式
- html5 contenteditable 可编辑属性
- 剪切后的文件可以恢复吗?恢复剪切文件怎么办?
- php操作 JSON格式数据
- ristretto255 point压缩和解压缩算法(1)——affine坐标系下
- Linux学习入门-------------------------VMvare与镜像的安装与配置
- 大数据组件之HBase
热门文章
- 基于图数据库的物联网模型(1)-图数据库与模型设计
- macos支持exfat吗_打造便捷、人性化的macOS桌面使用环境
- ZZULIOJ:1068: 二进制数
- 单片机c语言电梯楼层,基于单片机五层电梯课程设计.pdf
- vba和vb的小区别
- python数据可视化仪表盘_数据可视化(六)常见的可视化仪表盘(DashBoard)
- Matlab:查找要使用的函数
- properties中文乱码快速处理
- 开机自动拨号,断线重连,并且动态解析dns记录,java版
- pcb设计用什么软件?pcb设计常用工具有哪些?