Springboot鼓励零配置的方式,帮你做好大部分重复劳动的事,好到不能再好;具体的Redis安装方法和Springboot集成Redis方法,可以去搜索相关文章或参考该文章http://www.cnblogs.com/mengmeng89012/p/5519698.html。

当做用户权限管理时,一般都设置一个session过期时间,以确保用户长时间不操作时自动退出系统。

Spring seesions的原理可以参考该文章:http://blog.csdn.net/wojiaolinaaa/article/details/62424642

在springboot中设置該值的方法如下:

  1.  
    @Configuration
  2.  
    @EnableRedisHttpSession(maxInactiveIntervalInSeconds= 3600,redisNamespace = "tl")
  3.  
    public class RedisSessionConfig {
  4.  
     
  5.  
    }

即开启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函数:

  1.  
    public void setImportMetadata(AnnotationMetadata importMetadata) {
  2.  
     
  3.  
    Map<String, Object> enableAttrMap = importMetadata
  4.  
    .getAnnotationAttributes(EnableRedisHttpSession.class.getName());
  5.  
    AnnotationAttributes enableAttrs = AnnotationAttributes.fromMap(enableAttrMap);
  6.  
    /**
  7.  
    *解析注解,获取maxInactiveIntervalInSeconds赋值给配置类的maxInactiveIntervalInSeconds对象
  8.  
    */
  9.  
    this.maxInactiveIntervalInSeconds = enableAttrs
  10.  
    .getNumber("maxInactiveIntervalInSeconds");
  11.  
    String redisNamespaceValue = enableAttrs.getString("redisNamespace");
  12.  
    /**
  13.  
    *设置命名空间
  14.  
    */
  15.  
    if (StringUtils.hasText(redisNamespaceValue)) {
  16.  
    this.redisNamespace = this.embeddedValueResolver.resolveStringValue(redisNamespaceValue);
  17.  
    }
  18.  
    this.redisFlushMode = enableAttrs.getEnum("redisFlushMode");
  19.  
    }
	利用Redis作为sessions共享仓实现类为org.springframework.session.data.redis.RedisOperationsSessionRepository
其执行session过期策略的实现类为RedisSessionExpirationPolicy,其过期的具体函数如下:
  1.  
    public void onExpirationUpdated(Long originalExpirationTimeInMilli,
  2.  
    ExpiringSession session) {
  3.  
    String keyToExpire = "expires:" + session.getId();
  4.  
    long toExpire = roundUpToNextMinute(expiresInMillis(session));
  5.  
     
  6.  
    if (originalExpirationTimeInMilli != null) {
  7.  
    long originalRoundedUp = roundUpToNextMinute(originalExpirationTimeInMilli);
  8.  
    if (toExpire != originalRoundedUp) {
  9.  
    String expireKey = getExpirationKey(originalRoundedUp);
  10.  
    this.redis.boundSetOps(expireKey).remove(keyToExpire);
  11.  
    }
  12.  
    }
  13.  
     
  14.  
    long sessionExpireInSeconds = session.getMaxInactiveIntervalInSeconds();
  15.  
    String sessionKey = getSessionKey(keyToExpire);
  16.  
     
  17.  
    if (sessionExpireInSeconds < 0) {
  18.  
    this.redis.boundValueOps(sessionKey).append("");
  19.  
    this.redis.boundValueOps(sessionKey).persist();
  20.  
    this.redis.boundHashOps(getSessionKey(session.getId())).persist();
  21.  
    return;
  22.  
    }
  23.  
     
  24.  
    String expireKey = getExpirationKey(toExpire);
  25.  
    BoundSetOperations<Object, Object> expireOperations = this.redis
  26.  
    .boundSetOps(expireKey);
  27.  
    expireOperations.add(keyToExpire);
  28.  
    /**
  29.  
    *关键在此处,在设置的基础上增加了5分钟
  30.  
    /
  31.  
    long fiveMinutesAfterExpires = sessionExpireInSeconds
  32.  
    + TimeUnit.MINUTES.toSeconds(5);
  33.  
     
  34.  
    expireOperations.expire(fiveMinutesAfterExpires, TimeUnit.SECONDS);
  35.  
    if (sessionExpireInSeconds == 0) {
  36.  
    this.redis.delete(sessionKey);
  37.  
    }
  38.  
    else {
  39.  
    this.redis.boundValueOps(sessionKey).append("");
  40.  
    this.redis.boundValueOps(sessionKey).expire(sessionExpireInSeconds,
  41.  
    TimeUnit.SECONDS);
  42.  
    }
  43.  
    this.redis.boundHashOps(getSessionKey(session.getId()))
  44.  
    .expire(fiveMinutesAfterExpires, TimeUnit.SECONDS);
  45.  
    }
  46.  

Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析的更多相关文章

  1. spring boot集成redis实现session共享

    1.pom文件依赖 <!--spring boot 与redis应用基本环境配置 --> <dependency> <groupId>org.springframe ...

  2. Spring Boot 2.X(六):Spring Boot 集成Redis

    Redis 简介 什么是 Redis Redis 是目前使用的非常广泛的免费开源内存数据库,是一个高性能的 key-value 数据库. Redis 与其他 key-value 缓存(如 Memcac ...

  3. SpringBoot(十一): Spring Boot集成Redis

    1.在 pom.xml 中配置相关的 jar 依赖: <!-- 加载 spring boot redis 包 --> <dependency> <groupId>o ...

  4. spring boot集成redis基础入门

    redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储. 可以进行master-slave模式的数据备份 更多redis相关文档请 ...

  5. (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...

  6. 【spring boot】【redis】spring boot 集成redis的发布订阅机制

    一.简单介绍 1.redis的发布订阅功能,很简单. 消息发布者和消息订阅者互相不认得,也不关心对方有谁. 消息发布者,将消息发送给频道(channel). 然后是由 频道(channel)将消息发送 ...

  7. spring boot 集成 redis lettuce

    一.简介 spring boot框架中已经集成了redis,在1.x.x的版本时默认使用的jedis客户端,现在是2.x.x版本默认使用的lettuce客户端,两种客户端的区别如下 # Jedis和L ...

  8. spring boot 集成 redis lettuce(jedis)

    spring boot框架中已经集成了redis,在1.x.x的版本时默认使用的jedis客户端,现在是2.x.x版本默认使用的lettuce客户端 引入依赖 <!-- spring boot ...

  9. Spring Boot集成Redis集群(Cluster模式)

    目录 集成jedis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 集成spring-data-redis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 异常处理 同样的, ...

随机推荐

  1. MVP on Board 没用小技巧 👌

    七月入选了微软 MVP,本文记录 on board 过程中遇到的小问题和没用小技巧. MVP Portal 当你收到来自微软的确认邮件之后,你将正式被接纳为微软现任 MVP 的一员.从此刻开始,你便拥 ...

  2. VRRP概述作用及配置

    文章目录 VRRP的概述 VRRP的作用 虚拟路由器 Master报文的发送 VRRP状态机 VRRP华为命令配置 VRRP的概述1.利用VRRP,一组路由器(同一个LAN中的接口),协同工作,但是只 ...

  3. chage 修改用户密码时间限制

    chage [options] LOGIN chage针对用户的密码过期时间.过期提前多少天警示等功能实现,passwd也可以实现,但是passwd --expire参数是直接用户密码过期,强制用户下 ...

  4. ORM研究3 - odoo fields常用的字段属性

    之前我们已经讲解了odoo ORM中的一些对字段常用的API操作方法,今天我们继续研究一下Odoo orm中字段的一些通用属性字段的使用,学会它们可以为自己创建数据映射并使用有更好的帮助. 通用字段属 ...

  5. MyEclipse无法打开jsp文件(打开是空白的),但是可以打开java文件

    转载: 解决MyEclipse使用时打开JSP发生"An error has occurred,See error log for more details"错误的解决方法这个问题 ...

  6. aptitude软件状态标志i、v、p

    输出的结果分三栏,分别为状态.包名和描述.而状态则由p.i.v等字母表示.查询后才知道这些标识的含义是这样的: i - 包已经成功安装,并且所有依赖都满足. c - 包已经被移除,但是配置文件被保留. ...

  7. 5G[generation]的知识收集

    一.什么是5G? G的英文是"5 Generation",即第五代无线通讯系统. 二.发展历程 1G的速率只有2.4k.2G是64k.3G是2M.4G{2013年12月,我国第四代 ...

  8. n皇后问题(回溯法)——Python实现

      八皇后问题 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  9. vue、gulp、webpack踩过的坑和笔记

    1.监听流错误 stream-combiner2 2.热更新Browsersync与element冲突,换成gulp-connect 3.gulp-uglify压缩js不能压缩es6 4.使用vue- ...

  10. Mysql命令语句

    常用的管理命令 SHOW DATABASES;    //显示当前服务器下所有的数据库 USE 数据库名称;          //进入指定的数据 show tables;              ...