Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析
2017-05-17 10:29
866 查看
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函数:[code]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");}[/code][/code]利用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);}
相关文章推荐
- springboot 集成redis实现session共享
- springboot整合redis,实现session共享
- 【Redis】spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- SpringBoot集成Redis来实现缓存技术方案
- spring boot + redis 实现session共享
- (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- spring boot + redis 实现session共享
- 35. Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
- SpringBoot集成Redis来实现缓存技术方案
- SpringBoot学习笔记(5) Spring Boot集成Redis实现自动配置
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
- 【springBoot】springBoot集成redis的key,value序列化的相关问题
- Spring Boot集成Redis实现缓存机制
- spring boot学习5之session+redis解决session共享问题
- SpringSession集成redis实现session共享(No bean named 'springSessionRepositoryFilter' available)
- spring boot + redis 实现session共享
- spring boot + redis 实现session共享