怎么在SpringBoot中使用复述,统计在线用户信息

  介绍

怎么在SpringBoot中使用复述,统计在线用户信息吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

SpringBoot是什么

SpringBoot一种全新的编程规范,其设计目的是用来简化新弹簧应用的初始搭建以及开发过程,SpringBoot也是一个服务于框架的框架,服务范围是简化配置文件。

基于数据库实现

最简单的办法,就是在用户表,添加一个最后心跳包的日期时间字段last_active。服务器收到心跳后,每次都去更新这个字段为当前的最新时间。

如果要查询最近5分钟活跃的用户数量,就可以简单的通过一句SQL完成。

SELECT 计数(1),AS “online_user_count”,得到“用户”,WHERE “last_active”,结构、,& # 39;2020 - 12 - 22,13:00:00& # 39;,以及& # 39;020 - 12 - 22,13:05:00& # 39;;

弊端也是显而易见,为了提高检索效率,不得不为last_active字段添加索引,而因为心跳的更新,会导致频繁的重新维护索引树,效率极其低下。

基于复述,实现

这是比较理想的一种实现方式了,复述,基于内存进行读,写性能自然比关系型数据库好得多,而且它所提供的Zset可以很方便的构建出一个在线用户的统计服务。

复述的Zset

这里不会涉及太多复述的东西,简单说明以下Zset。它是一个有序集的组合,集合中的每个元素由2个东西组成

<李>

成员既然是集合,那么它便是集合中的元素,并且不能重复

<李>

得分,既然是有序的,它就是用于排序的权重字段

Zset的部分操作

添加元素

ZADD  key  score  member  [score  member …)

一次性添加一个或者多个元素到集合,如果成员已经存在则会使用当前得分进行覆盖

统计所有的元素数量

ZCARD 关键

统计得分值在最小和最大之间元素数量

ZCOUNT  key  min 马克思

删除分数值在最小和最大之间的元素

ZREMRANGEBYSCORE  key  min 马克思

一个示例

我打算,用一个zset存储我内心中编程语言的评分排名,这叫个关键做朗

添加信息,返回新添加的元素个数

祝辞,zadd  lang  999年,php  10, java  9, go  8, python  7, javascript   “5”

查看添加的数量

祝辞zcard 朗   “5”

查看评分在8 - 10之间的元素个数,有3个

祝辞,zcount  lang  8, 10   “3“

删除评分在8 - 1000的元素,返回删除的个数

祝辞,ZREMRANGEBYSCORE  lang  8, 1000   “4“

在线用户服务的实现

知道了zset后,就可以实现一个在线用户的统计服务了。

实现思路

客户端每隔5分钟发送一个心跳到服务器,服务器根据会话获取到用户的ID,作为zset的成员
存入zset,分数便是当前收到心跳的时间戳,当同一个用户第二次发送心跳的时候,就会更新他对应的分数值,由于更新是在内存,这个速度相当快。

zadd  users  1608616915109, 10000

需要统计出在线用户的数量,本质上就是需要统计出,最近5分钟有发送心跳的用户,通过zcount可以很轻松的统计出来。通过程序获取到当前的时间戳,作为maxScore,时间戳减去5分钟后作为minScore。

zcount  users  1608616615109, 1608616915109

因为某些用户可能长时间没有登录过了,可以通过ZREMRANGEBYSCORE进行清理。通过程序获取到当前的时间戳,减去5分钟后作为maxScore,使用0,作为minScore,表示清理所有超过5分钟没有发送过心跳包的用户。

ZREMRANGEBYSCORE  users  0, 1608616615109

实现代码

import  java.time.Duration;   import  java.time.Instant;   import  java.time.LocalDateTime;   import  java.time.ZoneId;      import  javax.annotation.Resource;      import  org.springframework.data.redis.core.StringRedisTemplate;   import  org.springframework.stereotype.Component;/* *   *大敌;   *大敌;   ,*在线用户统计   *大敌;   ,* @author 管理员   ,*   ,*/@ component   public  class  OnlineUserStatsService  {   ,,,,   ,,,private  static  final  String  ONLINE_USERS =,“onlie_users";      ,,@   ,,,private  StringRedisTemplate  stringRedisTemplate;      ,,,/* *   ,,,,*,添加用户在线信息   ,,,,*,@param  userId   ,,,,*,@return    ,,,*/,,,public  Boolean 在线(Integer  userId), {   ,,,,,,,return  this.stringRedisTemplate.opsForZSet阀门()(ONLINE_USERS, userId.toString (),, Instant.now () .toEpochMilli ());   ,,,}   ,,,,   ,,,/* *   ,,,,*,获取一定时间内,在线的用户数量   ,,,,*,@param 持续时间   ,,,,* @return   ,,,*/,,,public  Long 计数(Duration 持续时间),{   ,,,,,,,LocalDateTime 你=,LocalDateTime.now ();   ,,,,,,,return  this.stringRedisTemplate.opsForZSet () .count (ONLINE_USERS,,   ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,now.minus(持续时间).atZone (ZoneId.systemDefault ()) .toInstant () .toEpochMilli (),,   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在SpringBoot中使用复述,统计在线用户信息