Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析
Springboot鼓励零配置的方式,帮你做好大部分重复劳动的事,好到不能再好;具体的Redis安装方法和Springboot集成Redis方法,可以去搜索相关文章或参考该文章http://www.cnblogs.com/mengmeng89012/p/5519698.html。
当做用户权限管理时,一般都设置一个session过期时间,以确保用户长时间不操作时自动退出系统。
Spring seesions的原理可以参考该文章:http://blog.csdn.net/wojiaolinaaa/article/details/62424642
在springboot中设置該值的方法如下:
- @Configuration
- @EnableRedisHttpSession(maxInactiveIntervalInSeconds= 3600,redisNamespace = "tl")
- public class RedisSessionConfig {
- }
即开启Redis共享sessions的配置类的注解设置maxInactiveIntervalInSeconds的值,单位为秒,默认值为1800秒;问题来了,当设置其为600秒时,在redis的客户端查看sessions的key的过期时间时(redis命令:ttl key,查看其有效时间),发现該值为1100秒;有问题有疑惑找源码,集成redis的代码在spring-sessions包中,找到
org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession注解,该注解的解析类为:
org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration;可以看到
maxInactiveIntervalInSeconds默认值为1800秒,找到setImportMetadata函数:
- public void setImportMetadata(AnnotationMetadata importMetadata) {
- Map<String, Object> enableAttrMap = importMetadata
- .getAnnotationAttributes(EnableRedisHttpSession.class.getName());
- AnnotationAttributes enableAttrs = AnnotationAttributes.fromMap(enableAttrMap);
- /**
- *解析注解,获取maxInactiveIntervalInSeconds赋值给配置类的maxInactiveIntervalInSeconds对象
- */
- this.maxInactiveIntervalInSeconds = enableAttrs
- .getNumber("maxInactiveIntervalInSeconds");
- String redisNamespaceValue = enableAttrs.getString("redisNamespace");
- /**
- *设置命名空间
- */
- if (StringUtils.hasText(redisNamespaceValue)) {
- this.redisNamespace = this.embeddedValueResolver.resolveStringValue(redisNamespaceValue);
- }
- this.redisFlushMode = enableAttrs.getEnum("redisFlushMode");
- }
利用Redis作为sessions共享仓实现类为org.springframework.session.data.redis.RedisOperationsSessionRepository
其执行session过期策略的实现类为RedisSessionExpirationPolicy,其过期的具体函数如下:
public void onExpirationUpdated(Long originalExpirationTimeInMilli,
- ExpiringSession session) {
- String keyToExpire = "expires:" + session.getId();
- long toExpire = roundUpToNextMinute(expiresInMillis(session));
- if (originalExpirationTimeInMilli != null) {
- long originalRoundedUp = roundUpToNextMinute(originalExpirationTimeInMilli);
- if (toExpire != originalRoundedUp) {
- String expireKey = getExpirationKey(originalRoundedUp);
- this.redis.boundSetOps(expireKey).remove(keyToExpire);
- }
- }
- long sessionExpireInSeconds = session.getMaxInactiveIntervalInSeconds();
- String sessionKey = getSessionKey(keyToExpire);
- if (sessionExpireInSeconds < 0) {
- this.redis.boundValueOps(sessionKey).append("");
- this.redis.boundValueOps(sessionKey).persist();
- this.redis.boundHashOps(getSessionKey(session.getId())).persist();
- return;
- }
- String expireKey = getExpirationKey(toExpire);
- BoundSetOperations<Object, Object> expireOperations = this.redis
- .boundSetOps(expireKey);
- expireOperations.add(keyToExpire);
- /**
- *关键在此处,在设置的基础上增加了5分钟
- /
- long fiveMinutesAfterExpires = sessionExpireInSeconds
- + TimeUnit.MINUTES.toSeconds(5);
- expireOperations.expire(fiveMinutesAfterExpires, TimeUnit.SECONDS);
- if (sessionExpireInSeconds == 0) {
- this.redis.delete(sessionKey);
- }
- else {
- this.redis.boundValueOps(sessionKey).append("");
- this.redis.boundValueOps(sessionKey).expire(sessionExpireInSeconds,
- TimeUnit.SECONDS);
- }
- this.redis.boundHashOps(getSessionKey(session.getId()))
- .expire(fiveMinutesAfterExpires, TimeUnit.SECONDS);
- }
Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析的更多相关文章
- spring boot集成redis实现session共享
1.pom文件依赖 <!--spring boot 与redis应用基本环境配置 --> <dependency> <groupId>org.springframe ...
- Spring Boot 2.X(六):Spring Boot 集成Redis
Redis 简介 什么是 Redis Redis 是目前使用的非常广泛的免费开源内存数据库,是一个高性能的 key-value 数据库. Redis 与其他 key-value 缓存(如 Memcac ...
- SpringBoot(十一): Spring Boot集成Redis
1.在 pom.xml 中配置相关的 jar 依赖: <!-- 加载 spring boot redis 包 --> <dependency> <groupId>o ...
- spring boot集成redis基础入门
redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储. 可以进行master-slave模式的数据备份 更多redis相关文档请 ...
- (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...
- 【spring boot】【redis】spring boot 集成redis的发布订阅机制
一.简单介绍 1.redis的发布订阅功能,很简单. 消息发布者和消息订阅者互相不认得,也不关心对方有谁. 消息发布者,将消息发送给频道(channel). 然后是由 频道(channel)将消息发送 ...
- spring boot 集成 redis lettuce
一.简介 spring boot框架中已经集成了redis,在1.x.x的版本时默认使用的jedis客户端,现在是2.x.x版本默认使用的lettuce客户端,两种客户端的区别如下 # Jedis和L ...
- spring boot 集成 redis lettuce(jedis)
spring boot框架中已经集成了redis,在1.x.x的版本时默认使用的jedis客户端,现在是2.x.x版本默认使用的lettuce客户端 引入依赖 <!-- spring boot ...
- Spring Boot集成Redis集群(Cluster模式)
目录 集成jedis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 集成spring-data-redis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 异常处理 同样的, ...
随机推荐
- 基于Flink构建全场景实时数仓
目录: 一. 实时计算初期 二. 实时数仓建设 三. Lambda架构的实时数仓 四. Kappa架构的实时数仓 五. 流批结合的实时数仓 实时计算初期 虽然实时计算在最近几年才火起来,但是在早期也有 ...
- EXCEL:关键字有重复,其他信息一行多列显示
=INDEX(A:A,SMALL(IF(MATCH($A$2:$A$13,$A$2:$A$13,0)=ROW($A$2:$A$13)-1,ROW($2:$13),4^8),ROW(1:1)))& ...
- final修饰符(3)-基本类型变量和引用类型变量的区别
final修饰基本类型变量 当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变 final修饰引用类型变量 当使用final修饰引用类型变量时,它保存的仅仅是一 ...
- Motion Planning 是什么
前言与引用 这一个呢,主要是自己突然看一篇论文的时候不知道 为什么他提出的方法对于规划来说就是好的,规划又应该分为哪几个部分,解决的是哪几个部分的问题?带着这个问题,我就去搜:Motion Plann ...
- 【开发工具】-- IDEA集成Git在实际项目中的运用
1.企业实际项目中Git的使用 在实际的企业项目开发中,我们一般Java的项目在公司都有自己的局域网代码仓库,仓库上存放着很多的项目.以我工作过的公司如华为的项目,一般是存放在企业内部的CodeHub ...
- Tbase读写分离与分库分表
一.读写分离 1.1 what 读写分离 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事 ...
- IDEA如何导出war包
网上有很多关于IDEA导出war包的教程,然而很多照着一步步操作以后,war包并不能在对应目录中找到.参考网上一篇博文,发现其方法描述比较详细且经验证有效. 完整流程如下: 首先点击这里进入项目的配置 ...
- odoo里面批量上传图片
import os import base64 def base_data_product_image(self): """ odoo里批量创建产品,并上传图片 图片为b ...
- 第二十五篇 -- C++宝典中的图书管理系统
此篇文章是基于C++宝典写的图书管理系统,本人对其中的部分做了相应修改,并且以现有格式替代原有格式,使程序更加清晰明了.此程序运行在VS2017上. 系统设计 图书管理系统分为四个模块:图书管理模块. ...
- SpringBoot下Schdule的配置与使用
我们在平常项目开发中,经常会用到周期性定时任务,这个时候使用定时任务就能很方便的实现.在SpringBoot中用得最多的就是Schedule. 一.SpringBoot集成Schedule 1.依赖配 ...