加入收藏 | 设为首页 | 会员中心 | 我要投稿 伊春站长网 (https://www.0458zz.com/)- 管理运维、图像技术、数据标注、智能营销、数据计算!
当前位置: 首页 > 站长资讯 > 动态 > 正文

人工智能除了AI换脸,还能干什么?

发布时间:2021-02-10 12:30:19 所属栏目:动态 来源:互联网
导读:这里重点介绍下RedisOperationsSessionRepository。在详细介绍其之前,了解下RedisOperationsSessionRepository的数据存储细节。 当创建一个RedisSession,然后存储在Redis中时,RedisSession的存储细节如下: spring:session:sessions:33fdd1b6-b496-4b33-9

这里重点介绍下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中有两个非常重要的成员属性:

  •  cached:实际上是一个MapSession实例,用于做本地缓存,每次在getAttribute时无需从Redis中获取,主要为了improve性能
  •  delta:用于跟踪变化数据,做持久化

再来看下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的基本行为:

  •  getId:获取sessionId
  •  setAttribute:设置session属性
  •  getAttribte:获取session属性

ExipringSession:提供Session额外的过期特性。定义了以下关于过期的行为:

  •  setLastAccessedTime:设置最近Session会话过程中最近的访问时间
  •  getLastAccessedTime:获取最近的访问时间
  •  setMaxInactiveIntervalInSeconds:设置Session的最大闲置时间
  •  getMaxInactiveIntervalInSeconds:获取最大闲置时间
  •  isExpired:判断Session是否过期

MapSession:基于java.util.Map的ExpiringSession的实现

RedisSession:基于MapSession和Redis的ExpiringSession实现,提供Session的持久化能力

先来看下MapSession的代码源码片段

 

(编辑:伊春站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读