SpringBoot应用系列文章
序
为承接SpringBoot应用之分布式会话这篇,本文主要解析一下SpringSession的原理。
Session解决方案
-
session复制
-
session粘合
-
集群session
-
扩展指定server
利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。不过这种方式有个缺点,就是需要耦合Tomcat/Jetty等Servlet容器的代码。这方面其实早就有开源项目了,例如 memcached-session-manager ,以及 tomcat-redis-session-manager 。暂时都只支持Tomcat6/Tomcat7。 -
设计一个Filter
利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作。spring-session就是通过这样的思路实现的。
-
SpringSession的几个关键类
-
SessionRepositoryFilter(
order是Integer.MIN_VALUE + 50
)
SessionRepositoryRequestWrapper与SessionRepositoryResponseWrapper,通过SessionRepository去操纵session -
SessionRepository
-
CookieHttpSessionStrategy
如何处理Session过期
SpringSession的redis实现,依赖了redis的过期机制。
redis的过期键的删除策略(懒性删除+定期删除
)
<<redis设计与实现>>一书提到过期键的三种删除策略:
定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
redis实际是以懒性删除+定期删除这种策略组合来实现过期键删除的,导致Spring需要采用及时删除的策略(定时轮询
),在过期的时候,访问一下该key,然后及时触发惰性删除
Spring的轮询如何保证时效性
@Scheduled(cron = "0 * * * * *")
//每分钟跑一次,每次清除前一分钟的过期键
public void cleanExpiredSessions() {
long now = System.currentTimeMillis();
long prevMin = roundDownMinute(now);
if (logger.isDebugEnabled()) {
logger.debug("Cleaning up sessions expiring at " + new Date(prevMin));
}
String expirationKey = getExpirationKey(prevMin);
Set < String > sessionsToExpire = expirationRedisOperations.boundSetOps(expirationKey).members();
expirationRedisOperations.delete(expirationKey);
for (String session: sessionsToExpire) {
String sessionKey = getSessionKey(session);
touch(sessionKey);
}
}
这里的touch操作就是访问该key,然后触发redis删除。
/**
* By trying to access the session we only trigger a deletion if it the TTL is expired. This is done to handle
* https://github.com/spring-projects/spring-session/issues/93
*
* @param key
*/
private void touch(String key) {
sessionRedisOperations.hasKey(key);
}
-
主动删除session
public void onDelete(ExpiringSession session) {
long toExpire = roundUpToNextMinute(expiresInMillis(session));
String expireKey = getExpirationKey(toExpire);
expirationRedisOperations.boundSetOps(expireKey).remove(session.getId());
}
-
延长session过期时间
public void onExpirationUpdated(Long originalExpirationTimeInMilli, ExpiringSession session) {
if (originalExpirationTimeInMilli != null) {
long originalRoundedUp = roundUpToNextMinute(originalExpirationTimeInMilli);
String expireKey = getExpirationKey(originalRoundedUp);
expirationRedisOperations.boundSetOps(expireKey).remove(session.getId());
}
long toExpire = roundUpToNextMinute(expiresInMillis(session));
String expireKey = getExpirationKey(toExpire);
BoundSetOperations < String,
String > expireOperations = expirationRedisOperations.boundSetOps(expireKey);
expireOperations.add(session.getId());
long sessionExpireInSeconds = session.getMaxInactiveIntervalInSeconds();
String sessionKey = getSessionKey(session.getId());
expireOperations.expire(sessionExpireInSeconds + 60, TimeUnit.SECONDS);
sessionRedisOperations.boundHashOps(sessionKey).expire(sessionExpireInSeconds, TimeUnit.SECONDS);
}
参考
https://segmentfault.com/a/1190000004369392
相关推荐
Struts、Spring和Hibernate是Java开发中非常著名的三个开源框架,它们共同构成了经典的"SSH...通过阅读《Struts + Spring + Hibernate工作原理解析》文档,你可以更系统地掌握这些知识,为你的项目开发带来极大的帮助。
通过上述内容,我们可以了解到Spring的核心原理之一就是IoC容器的设计与实现,它通过灵活的配置和强大的扩展性为开发者提供了丰富的功能和服务。掌握Spring的源码解析不仅可以帮助开发者更好地理解和使用Spring框架...
6. **Spring与Hibernate集成**:"spring源代码解析(八):spring驱动Hibernate的实现.doc"探讨了Spring如何与ORM框架Hibernate协同工作,包括SessionFactory的创建、Session管理以及事务策略的配置。 7. **Spring ...
【标题】:“Hibernate、Spring和Struts工作原理及使用理由” 【内容】: Hibernate是一个流行的Java持久化框架,它的核心工作原理主要包括以下步骤: 1. **读取并解析配置文件**:Hibernate通过读取hibernate....
本篇文章主要探讨如何将Hibernate与Spring进行集成,并通过具体的配置示例来深入理解其工作原理。 ##### 1. 数据源配置 数据源是连接数据库的关键组件,在Spring框架中可以通过多种方式配置数据源。这里采用的是C3...
4. **Bean的作用域**:Spring提供了多种Bean的作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等,根据不同的需求选择合适的Bean作用域。 5. **Bean的生命周期**:Spring容器对...
SPRING FRAMEWORK BEAN作用域和生命周期原理解析 Spring Framework 是一个流行的 Java Web 应用程序框架,它提供了一个强大的依赖注入机制,称为 Bean 容器。Bean 容器管理着应用程序中的所有对象,并提供了一些...
### Spring源码解析知识点 #### 1. Spring IoC 容器概述 ...以上是关于 Spring 源码解析的一些关键知识点,这些知识点不仅有助于深入理解 Spring 的工作原理,也是进行高级应用开发和架构设计的基础。
### Spring技术内幕:深入解析Spring架构与设计原理(第2版) #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,它最初是为了简化企业级Java应用程序的开发而设计的。Spring的核心功能包括...
《Spring源码解析》系列文章深入探讨了Spring框架的核心组件和工作原理,为读者提供了丰富的技术洞察。以下是对这些主题的详细解读: 1. **Spring MVC**:Spring MVC是Spring框架的一部分,它提供了构建Web应用程序...
标签"源码"提示我们,这篇博客可能还涉及到了Session实现的内部代码或开源库的源码分析,这可能包括对Servlet容器(如Tomcat)中Session管理的源码研究,或者是第三方库(如Spring Session)的实现原理。 至于"工具...
【Spring工作原理】 Spring框架的核心概念是依赖注入(Dependency Injection,简称DI),也被称为控制反转(Inversion of Control,简称IOC)。IOC使得开发者无需在代码中手动创建对象,而是通过配置文件或注解来...
3. **Spring MVC**:探索Spring MVC框架用于构建Web应用程序的方式,包括控制器、模型、视图和视图解析器的概念。 4. **Spring Data**:了解如何利用Spring Data简化数据库操作,包括JPA(Java Persistence API)和...
理解`@Transactional`的工作原理和Spring AOP代理机制,以及与EntityManager的关系,可以帮助我们更好地诊断和解决问题。 总的来说,`@Transactional`提供了声明式的事务管理,极大地简化了事务相关的代码,同时...
Spring Security和Spring Session分别关注应用的安全性和会话管理,确保用户数据的安全。 在大数据领域,Apache Hive是一个基于Hadoop的数据仓库工具,用于查询和管理大规模数据集。HBase是一个分布式、高性能、列...
"Spring注解@Scope原理及用法解析" Spring 注解 @Scope 是 Spring IoC 容器中的一个作用域,用于定义 Bean 的生命周期和作用域。在 Spring 中,@Scope 注解可以用来定义 Bean 的实例化方式和生命周期。下面我们将...
Spring MVC可以与Spring的其他模块无缝集成,如Spring Security进行安全控制,Spring Data进行数据访问,Spring Session管理会话等,使得整个应用架构更为统一和高效。 总结,Spring Web MVC是Java Web开发的强大...