人工智能除了AI换脸,还能干什么?
|
这里重点介绍下RedisOperationsSessionRepository。在详细介绍其之前,了解下RedisOperationsSessionRepository的数据存储细节。 当创建一个RedisSession,然后存储在Redis中时,RedisSession的存储细节如下: spring:session:sessions:33fdd1b6-b496-4b33-9f7d-df96679d32fe spring:session:sessions:expires:33fdd1b6-b496-4b33-9f7d-df96679d32fe spring:session:expirations:1439245080000 Redis会为每个RedisSession存储三个k-v。 1. 第一个k-v用来存储Session的详细信息,包括Session的过期时间间隔、最近的访问时间、attributes等等。这个k的过期时间为Session的最大过期时间 + 5分钟。如果默认的最大过期时间为30分钟,则这个k的过期时间为35分钟 2. 第二个k-v用来表示Session在Redis中的过期,这个k-v不存储任何有用数据,只是表示Session过期而设置。这个k在Redis中的过期时间即为Session的过期时间间隔 3. 第三个k-v存储这个Session的id,是一个Set类型的Redis数据结构。这个k中的最后的1439245080000值是一个时间戳,根据这个Session过期时刻滚动至下一分钟而计算得出。
这里不由好奇,为什么一个RedisSession却如此复杂的存储。关于这个可以参考spring-session作者本人在github上的两篇回答: 首先看javadocs,对于阅读源码,学会看javadocs非常重要! 基于MapSession的基本映射实现的Session,能够追踪发生变化的所有属性,当调用saveDelta方法后,变化的属性将被持久化! 在RedisSession中有两个非常重要的成员属性:
再来看下RedisSession中最为重要的行为saveDelta——持久化Session至Redis中: MapSession中持有HashMap类型的变量sessionAtts用于存储Session设置属性,比如调用的setAttribute方法的k-v就存储在该HashMap中。这个和tomcat内部实现HttpSession的方式类似,tomcat中使用了ConcurrentHashMap存储。
其中lastAccessedTime用于记录最近的一次访问时间,maxInactiveInterval用于记录Session的最大闲置时间(过期时间-针对没有Request活跃的情况下的最大时间,即相对于最近一次访问后的最大闲置时间)。 Tips:适配器模式 spring-session单独抽象出Session层接口,可以应对多种场景下不同的session的实现,然后通过适配器模式将Session适配成HttpSession的接口,精妙至极! Session是spring-session对session的抽象,主要是为了鉴定用户,为Http请求和响应提供上下文过程,该Session可以被HttpSession、WebSocket Session,非WebSession等使用。定义了Session的基本行为:
ExipringSession:提供Session额外的过期特性。定义了以下关于过期的行为:
MapSession:基于java.util.Map的ExpiringSession的实现 RedisSession:基于MapSession和Redis的ExpiringSession实现,提供Session的持久化能力
先来看下MapSession的代码源码片段 (编辑:伊春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
