SpringSession通过Redis统计在线用户数量的实现代码
来源:脚本之家
2023-05-12 16:50:39
0浏览
收藏
数据库小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《SpringSession通过Redis统计在线用户数量的实现代码》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!
最近遇到一个比较紧急的任务,要求统计在线用户,目的是配合性能测评,要求证明自己系统的在线用户能够达标,不过系统因为历史原因,并没有这个功能,所以只能去springSession官网和网上搜资料,想到通过统计redis里缓存的数据
因为系统原先的逻辑是使用Spring Session加上Redis做的会话共享实现的单点登录,登录之后会在session设置一个key值表示用户已经登录过,同时重写HttpServletRequestWrapper 设置remoteUser数据值
class RemoteUserRequestWrapper extends HttpServletRequestWrapper { String userCode; RemoteUserRequestWrapper(HttpServletRequest request) { super(request); this.userCode = (String) request.getSession() .getAttribute(org.apache.commons.lang3.StringUtils.isBlank(sessionKeyName)?DEFAULT_SESSION_KEY_NAME:sessionKeyName); } @Override public String getRemoteUser() { return userCode; } }
Spring Session缓存在redis里的数据
这个ssoLoginUser
key是自己登录时候设置的,根据业务修改,经过测试,在登出系统时候,session设置过期获取removeAttribute不能清redis里的key数据,所以只能在登出系统逻辑加上:
Set<string> keys = RedisUtils.redisTemplate.keys("spring:session:sessions:*"); for(String key : keys){ if(key.indexOf("expires")==-1){ String s = (String)RedisUtils.redisTemplate.opsForHash().get(key, "sessionAttr:ssoLoginUser"); if(request.getRemoteUser().equals(s)) { logger.info("loginusername:{}",s) RedisUtils.redisTemplate.opsForHash().delete(key, "sessionAttr:ssoLoginUser"); } } }</string>
进行数据统计:
List<map>> list = new ArrayList<map object>>(); List<map>> data = new ArrayList<map object>>(); Set<string> keys = redisTemplate.keys("spring:session:sessions:*"); for(String key : keys){ if(key.indexOf("expires")==-1){ String s = (String)redisTemplate.opsForHash().get(key, "sessionAttr:ssoLoginUser"); if(StringUtils.isNotBlank(s)) { System.out.println(s); Map<string> map = new HashMap<string>(16); map.put("usercode", s); list.add(map); } } } return list;</string></string></string></map></map></map></map>
pom.xml:
<dependency><groupid>org.springframework.session</groupid><artifactid>spring-session-data-redis</artifactid><version>1.2.2.RELEASE</version><type>pom</type></dependency><dependency><groupid>biz.paluch.redis</groupid><artifactid>lettuce</artifactid><version>3.5.0.Final</version></dependency>
RedisUtils.java:
package com.common.utils.redis; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebApplicationContext; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class RedisUtils { private RedisUtils() { } @SuppressWarnings("unchecked") public static RedisTemplate<string object> redisTemplate = ContextLoader.getCurrentWebApplicationContext().getBean(RedisTemplate.class); /** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * @return true=设置成功;false=设置失败 */ public static boolean expire(final String key, final long timeout) { return expire(key, timeout, TimeUnit.SECONDS); } /** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * @param unit 时间单位 * @return true=设置成功;false=设置失败 */ public static boolean expire(final String key, final long timeout, final TimeUnit unit) { Boolean ret = redisTemplate.expire(key, timeout, unit); return ret != null && ret; } /** * 删除单个key * * @param key 键 * @return true=删除成功;false=删除失败 */ public static boolean del(final String key) { redisTemplate.delete(key); return true; } /** * 删除多个key * * @param keys 键集合 * @return 成功删除的个数 */ public static long del(final Collection<string> keys) { redisTemplate.delete(keys); return 0; } /** * 存入普通对象 * * @param key Redis键 * @param value 值 */ public static void set(final String key, final Object value) { redisTemplate.opsForValue().set(key, value, 1, TimeUnit.MINUTES); } // 存储普通对象操作 /** * 存入普通对象 * * @param key 键 * @param value 值 * @param timeout 有效期,单位秒 */ public static void set(final String key, final Object value, final long timeout) { redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS); } /** * 获取普通对象 * * @param key 键 * @return 对象 */ public static Object get(final String key) { return redisTemplate.opsForValue().get(key); } // 存储Hash操作 /** * 往Hash中存入数据 * * @param key Redis键 * @param hKey Hash键 * @param value 值 */ public static void hPut(final String key, final String hKey, final Object value) { redisTemplate.opsForHash().put(key, hKey, value); } /** * 往Hash中存入多个数据 * * @param key Redis键 * @param values Hash键值对 */ public static void hPutAll(final String key, final Map<string object> values) { redisTemplate.opsForHash().putAll(key, values); } /** * 获取Hash中的数据 * * @param key Redis键 * @param hKey Hash键 * @return Hash中的对象 */ public static Object hGet(final String key, final String hKey) { return redisTemplate.opsForHash().get(key, hKey); } /** * 获取多个Hash中的数据 * * @param key Redis键 * @param hKeys Hash键集合 * @return Hash对象集合 */ public static List<object> hMultiGet(final String key, final Collection<object> hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } // 存储Set相关操作 /** * 往Set中存入数据 * * @param key Redis键 * @param values 值 * @return 存入的个数 */ public static long sSet(final String key, final Object... values) { Long count = redisTemplate.opsForSet().add(key, values); return count == null ? 0 : count; } /** * 删除Set中的数据 * * @param key Redis键 * @param values 值 * @return 移除的个数 */ public static long sDel(final String key, final Object... values) { Long count = redisTemplate.opsForSet().remove(key, values); return count == null ? 0 : count; } // 存储List相关操作 /** * 往List中存入数据 * * @param key Redis键 * @param value 数据 * @return 存入的个数 */ public static long lPush(final String key, final Object value) { Long count = redisTemplate.opsForList().rightPush(key, value); return count == null ? 0 : count; } /** * 往List中存入多个数据 * * @param key Redis键 * @param values 多个数据 * @return 存入的个数 */ public static long lPushAll(final String key, final Collection<object> values) { Long count = redisTemplate.opsForList().rightPushAll(key, values); return count == null ? 0 : count; } /** * 往List中存入多个数据 * * @param key Redis键 * @param values 多个数据 * @return 存入的个数 */ public static long lPushAll(final String key, final Object... values) { Long count = redisTemplate.opsForList().rightPushAll(key, values); return count == null ? 0 : count; } /** * 从List中获取begin到end之间的元素 * * @param key Redis键 * @param start 开始位置 * @param end 结束位置(start=0,end=-1表示获取全部元素) * @return List对象 */ public static List<object> lGet(final String key, final int start, final int end) { return redisTemplate.opsForList().range(key, start, end); } } </object></object></object></object></string></string></string>
ok,本博客只能学习参考,因为只是要给客户一些在线用户的证明而已,这个临时的统计不能用于生产,要做比较齐全的在线用户统计,需要花多点时间,有问题希望能指出。ok,简单记录一下,方便之后自己回顾
今天关于《SpringSession通过Redis统计在线用户数量的实现代码》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于redis的内容请关注golang学习网公众号!
版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除

- 上一篇
- Go中的panic/recover简介与实践记录

- 下一篇
- redis中RDB(RedisDataBase)的机制
查看更多
最新文章
-
- 数据库 · Redis | 6小时前 |
- Redis数据安全防护全攻略
- 112浏览 收藏
-
- 数据库 · Redis | 7小时前 |
- Redis哈希技巧与实战应用
- 204浏览 收藏
-
- 数据库 · Redis | 7小时前 |
- 扩展Redis集群节点的步骤与注意事项
- 163浏览 收藏
-
- 数据库 · Redis | 7小时前 |
- 高并发Redis优化技巧分享
- 147浏览 收藏
-
- 数据库 · Redis | 8小时前 |
- Redis主从复制故障排查指南
- 477浏览 收藏
-
- 数据库 · Redis | 11小时前 |
- Redis与HBase存储方案详解
- 414浏览 收藏
-
- 数据库 · Redis | 15小时前 |
- Redis与MongoDB缓存优化方法
- 193浏览 收藏
-
- 数据库 · Redis | 19小时前 |
- Redis安全配置更新操作教程
- 313浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis单节点迁移到集群的步骤详解
- 362浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis原子操作实现方式及使用场景
- 300浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis性能优化配置全攻略
- 173浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis性能问题分析及常见原因解析
- 234浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
查看更多
AI推荐
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 95次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 89次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 106次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 98次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 97次使用
查看更多
相关文章
-
- 分享Redis高可用架构设计实践
- 2023-01-24 286浏览
-
- Go与Redis实现分布式互斥锁和红锁
- 2022-12-22 117浏览
-
- Redis的各项功能解决了哪些问题?
- 2023-02-18 185浏览
-
- Go+Redis实现延迟队列实操
- 2023-02-23 426浏览
-
- 分享 echo-framework 项目基础框架
- 2023-01-11 134浏览