springboot项目Redis统计在线用户的实现示例

 更新时间:2024年06月06日 09:05:46   作者:...Yolo...  
最近做个项目需要统计在线用户,本文主要介绍了springboot项目Redis统计在线用户的实现示例,具有一定的参考价值,感兴趣的可以了解一下

我的项目有个显示用户的遗忘曲线,需要统计在线用户以计算他们的曲线

思考了两种方案,但都是用Redis的bitmap数据结构

Bitmap是一种特殊类型的数组,其中每个元素只能存储0或1。在Redis中,Bitmap实际上是字符串,每个字符的每一位都被视为一个独立的位,因此一个字符串可以存储多达8*字符串长度的位。 这段代码中,markUserActive方法接收一个用户ID作为参数。然后,它创建一个键,该键由字符串"active_users:"和当前日期组成,格式为ISO_DATE。这样,每天都会有一个新的键,用于存储当天活跃的用户。 然后,它使用redisUtils.setBit方法将用户ID对应的位设置为1。这里,用户ID被用作位的索引。例如,如果用户ID为10,那么第10位将被设置为1。 这样,我们就可以通过检查特定位的值来确定用户是否活跃。如果位的值为1,那么用户就是活跃的;如果位的值为0,那么用户就是不活跃的。 这种方法的优点是,它可以在非常小的空间内存储大量的信息。此外,由于Redis是内存数据库,因此这种方法的速度非常快。

方案一

  • 使用心跳包来追踪和统计用户活跃状态,客户端每隔30分钟或者一段时间给服务端发送一个心跳,服务端获取到用户id然后存储到Redis
  • 但这样的话客户端要定时任务,且依赖客户端。

方案二

  • 在用户每次请求操作的时候,由于我后端配置了Shiro的拦截器判断每次请求是否token过期,加入标记用户活跃的逻辑,并redis设置过期时间2小时
  • 缺点是资源消耗大,每次请求都要标记
@Override
    public void markUserActive(int userId) {
        String key = "active_users:" + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        redisUtils.setBit(key, userId, true);
        // 设置2小时的过期时间
        redisUtils.expire(key, 2, TimeUnit.HOURS);
    }

markUserActive(int userId) 方法: 这个方法用于标记一个用户为活跃状态。它接收一个用户ID作为参数。方法首先构造一个键,键的格式是 “active_users:” 加上当前的日期和时间。然后,它在 Redis 数据库中将这个键对应的位(由用户ID指定)设置为 true,表示该用户是活跃的。最后,它设置这个键的过期时间为2小时。这意味着,如果2小时内没有再次标记该用户为活跃,那么这个键就会从 Redis 数据库中删除。

@Override
    public List<Integer> getActiveUserIds() {
        List<Integer> activeUserIds = new ArrayList<>();

        // 当前时间
        LocalDateTime currentTime = LocalDateTime.now();
        for (int i = 0; i < 2; i++) {
            // 遍历过去2小时内的键
            String key = "active_users:" + currentTime.minusHours(i).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);

            if (redisUtils.hasKey(key)) {
                // 遍历1000个用户
                for (int j = 0; j < 1000; j++) {
                    Boolean isUserActive = redisUtils.getBit(key, j);
                    if (isUserActive != null && isUserActive) {
                        activeUserIds.add(j);
                    }
                }
            }
        }

        return activeUserIds;
    }

但是之后测试的时候发现在查找活跃用户的时候并没有找到,可能是时间戳精度问题,所以修改代码将其key保留到分钟形式

String key = "active_users:" + LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);

到此这篇关于springboot项目Redis统计在线用户的实现示例的文章就介绍到这了,更多相关springboot Redis统计在线用户内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springmvc整合freemarker配置的详细步骤

    springmvc整合freemarker配置的详细步骤

    本篇文章主要介绍了springmvc整合freemarker的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java中线程上下文类加载器超详细讲解使用

    Java中线程上下文类加载器超详细讲解使用

    这篇文章主要介绍了Java中线程上下文类加载器,类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例的代码模块。本文主要和大家聊聊JVM类加载器ClassLoader的使用,需要的可以了解一下
    2022-12-12
  • Java中的悲观锁与乐观锁是什么

    Java中的悲观锁与乐观锁是什么

    这篇文章主要介绍了Java中的悲观锁与乐观锁是什么,帮助大家更好的理解和学习Java锁的相关知识,感兴趣的朋友可以了解下
    2020-09-09
  • 如何用idea编写并运行第一个spark scala处理程序

    如何用idea编写并运行第一个spark scala处理程序

    详细介绍了如何使用IntelliJ IDEA创建Scala项目,包括配置JDK和Scala SDK,添加Maven支持,编辑pom.xml,并创建及运行Scala程序,这为Scala初学者提供了一个基础的项目搭建和运行指南
    2024-09-09
  • Java爬虫(Jsoup与WebDriver)的使用

    Java爬虫(Jsoup与WebDriver)的使用

    这篇文章主要介绍了Java爬虫(Jsoup与WebDriver)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java获取e.printStackTrace()打印的信息方式

    Java获取e.printStackTrace()打印的信息方式

    这篇文章主要介绍了Java获取e.printStackTrace()打印的信息方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 深入了解Spring控制反转IOC原理

    深入了解Spring控制反转IOC原理

    IOC-Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想。这篇文章将为大家介绍一下Spring控制反转IOC的原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Java中Map的遍历方法及性能测试

    Java中Map的遍历方法及性能测试

    这篇文章主要介绍了Java中Map的遍历方法及性能测试,本文讲解对HashMap、TreeMap进行对比测试,给出测试代码、测试结果和测试结论,需要的朋友可以参考下
    2015-01-01
  • 详解DES加密算法及在Java程序中的使用示例

    详解DES加密算法及在Java程序中的使用示例

    这篇文章主要介绍了详解DES加密算法及在Java程序中的使用示例,文中还有一个用Java实现的DES三重加密的例子,需要的朋友可以参考下
    2016-04-04
  • Java 比较接口comparable与comparator区别解析

    Java 比较接口comparable与comparator区别解析

    这篇文章主要介绍了Java 比较接口comparable与comparator区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论