springboot项目Redis统计在线用户

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小时
  • 缺点是资源消耗大,每次请求都要标记
@Overridepublic 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 数据库中删除。

@Overridepublic 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);
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python程序判断变量名是否符合标识符的定义

在 Python 中&#xff0c;标识符&#xff08;如变量名、函数名等&#xff09;必须遵循一些规则。这些规则包括&#xff1a; 标识符的第一个字符必须是字母&#xff08;a-z 或 A-Z&#xff09;或下划线&#xff08;_&#xff09;。标识符的其余部分可以由字母、数字或下划线组成…

UML的用例图

UML用例图 用例图示例 假设我们要描述一个图书馆管理系统的UML用例图。 参与者&#xff1a; Librarian&#xff08;图书管理员&#xff09;Member&#xff08;会员&#xff09;Guest&#xff08;访客&#xff09; 用例&#xff1a; Borrow Book&#xff08;借书&#xff09;R…

Web安全:Web体系架构存在的安全问题和解决方案

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

【毕业设计之微信小程序系列】基于微信小程序的餐厅点餐小程序的设计与实现

《基于微信小程序的餐厅点餐小程序的设计与实现》 项目效果图 目录大纲 摘要 1、选题及其意义 1.1、设计项目的名称 1.2、研究意义 2、需求分析 2.1、用户需求分析 2.2、功能需求分析 2.3、非功能需求分析 3、系统相关技术概述 3.1、餐饮平台开发相关技术 3.1.1、微信小程序 …

【BP时序预测】基于鱼鹰算法OOA优化BP神经网络实现温度数据预测算法研究附matlab代码

以下是一个大致的步骤和MATLAB代码框架&#xff1a; 数据准备&#xff1a;准备用于训练和测试的温度数据集。 初始化BP神经网络&#xff1a;定义神经网络的结构&#xff08;如隐藏层的数量和每层的神经元数量&#xff09;。 定义适应度函数&#xff1a;这是优化算法的目标函数…

读AI未来进行式笔记04数字医疗与机器人

1. 数字医疗 1.1. 20世纪的“现代医学”得益于史无前例的科学突破&#xff0c;使得医疗的方方面面都得到改善&#xff0c;让人类预期寿命从1900年的31岁提高到2017年的72岁 1.2. 现有的医疗数据库和流程将实现数字化 1.2.1. 患者记录 1.2.…

实时语音交互数字人解决方案,满足不同场景需求

北京美摄网络科技有限公司凭借其领先的实时语音交互数字人解决方案&#xff0c;为企业带来了全新的沟通体验与商业机遇。 一、技术革新&#xff0c;开启交互新篇章 美摄科技实时语音交互数字人解决方案&#xff0c;以先进的人工智能和机器学习技术为基础&#xff0c;实现了文…

速盾:网站使用cdn后,如何做动静分离?

动静分离是指将网站的静态资源&#xff08;如图片、CSS、JS等&#xff09;与动态内容&#xff08;如数据库查询、服务器脚本等&#xff09;分别存放在不同的服务器或环境中&#xff0c;以提高网站的性能和稳定性。而CDN&#xff08;Content Delivery Network&#xff09;是一种…

批量提取 Word 文档中的全部图片

步骤 1、打开 WinRAR 任选一个现成的压缩包双击打开 WinRAR &#xff0c;或从开始菜单打开 WinRAR 2、直接把要提取图片的 Word 文档拖入 WinRAR 菜单区域 1 → 2 → 3&#xff0c;WinRAR 资源管理目录中的 media 就是该 Word 文档所要提取的全部图片所在文件夹 按住&#x…

人工智能任务5-高级算法工程师需要学习哪些课程与掌握哪些能力

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能的任务5-高级算法工程师需要学习哪些课程&#xff0c;需要掌握哪些能力。高级算法工程师需要掌握的算法模型有&#xff1a;人脸检测模型MTCNN&#xff0c;人脸识别方法Siamese network、center loss、softm…

基于协同注意力的视觉-语言嵌入用于机器人手术视觉问题定位回答

文章目录 CAT-ViL: Co-attention Gated Vision-Language Embedding for Visual Question Localized-Answering in Robotic Surgery摘要方法实验结果 CAT-ViL: Co-attention Gated Vision-Language Embedding for Visual Question Localized-Answering in Robotic Surgery 摘要…

Python利用列表、字典和zip函数处理数据

最近重温Python基础语法&#xff0c;一道练习题巩固下列表、字典、循环 给定下面两个列表 attributes 和 values&#xff0c;要求针对 values 中每一组子列表 value&#xff0c;输出其和 attributes 中的键对应后的字典&#xff0c;最后返回字典组成的列表,请分别用一行和多行…

今日份动态规划学习(二维01背包+01背包变形)

目录 P1877 [HAOI2012] 音量调节 P1877 [HAOI2012] 音量调节 题解&#xff1a;一个入门级别的01背包问题&#xff0c;首先就是为什么能看出是01背包&#xff0c;因为只有两种状态&#xff0c;要不增大音量&#xff0c;要不减小音量&#xff0c;和01背包的选与不选非常近似。但…

next.js 的几种渲染方式

静态生成 (Static Generation)、服务器端渲染 (Server-Side Rendering) 和客户端渲染 (Client-Side Rendering) 是在构建 web 应用时常用的三种渲染策略。它们各自有不同的使用场景和优缺点。下面详细介绍它们的使用场景、差异和适用的情况。 静态生成 (Static Generation) 特…

探索SQL:从基础到高级的全面入门教程

SQL(Structured Query Language,结构化查询语言)是关系数据库管理系统中用于操作和查询数据的标准语言。它在数据管理和分析中扮演着至关重要的角色,无论是初学者还是有经验的开发者,都需要熟练掌握SQL的基本概念和高级功能。本文将从基础入门开始,逐步深入介绍SQL的语法…

酱菜产业:传承美味,点亮生活

酱菜&#xff0c;这道深受人们喜爱的传统美食&#xff0c;以其独特的风味和营养价值&#xff0c;点亮了我们的日常生活。酱菜产业作为美食文化的重要组成部分&#xff0c;正以其独特的魅力&#xff0c;吸引着越来越多的消费者。 酱菜产业的赵总说&#xff1a;酱菜的制作过程&am…

C++结合OpenCV进行图像处理与分类

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

Oracle中unique索引的作用是啥

在Oracle数据库中&#xff0c;UNIQUE索引是一种特殊的索引&#xff0c;它除了提供常规索引的快速检索功能外&#xff0c;还强制其索引列或列组合的值必须是唯一的。以下是UNIQUE索引的主要作用&#xff1a; 数据完整性&#xff1a;UNIQUE索引确保表中没有两行具有相同的索引列…

数据库(24)——外键约束

概念 外键用来让两张表的数据之间建立连接&#xff0c;从而保证数据的一致性和完整性。 具有外键的表称为子表&#xff0c;关联的表称为父表。 语法 添加外键 CREATE TABLE 表名( 字段名 数据类型, .. [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主…

CGS与MGS的矩阵正交化-C语言实现

格拉姆-施密特正交化和改进的格拉姆-施密特正交化 格拉姆-施密特正交化CGS 数学公式 代码实现&#xff1a; 过程版 矩阵运算实现的难点在于每次运算都是一个向量&#xff0c;需要for循环进行&#xff0c;会带来运算时在代码中的复杂&#xff0c;进而难以理解代码的过程 Q矩阵…