@EnableSpringHttpSession原理笔记

分布式集群Session共享问题解决方案-@EnableRedisHttpSession

使用redis数据库存储session代替本地存储session

@EnableRedisHttpSession

  1. 使用存储本地服务器的方式和使用存储Redis数据库的方式 都需要支持HttpSessionEvent
  2. HttpSessionEvent主要包含三个事件
    1. 创建事件
    2. 过期事件(过期用户自动登出)
    3. 销毁事件
  3. 使用本地存储的时候,可以使用设置监听的方式,监听事件的发生,从而做出相应的处理
  4. 使用Redis存储的时候,需要使用的KeySpce Notification键空间通知
    在这里插入图片描述
  5. Spring Session原理示意图
    在这里插入图片描述

Spring session在数据库中的存储形式

在这里插入图片描述
spring session 在redis数据库中会存在三个key如上图所示:exprationssessionsexpires

Redis + Spring session数据结构及作用

在这里插入图片描述

Redis触发过期事件的方式

redis 需要触发过期事件,才能向spring服务端发送键空间通知
redis session的最大的延迟事件是1分钟

  1. 客户端访问的时候发现key过期
  2. redis在一定事件间隔频率在后台逐步查找过期键

如果仅用上述两个redis自带的机制无法保证key的过期事件抵达后立即生成过期事件。

通过添加key的方式实现及时过期session的需求在这里插入图片描述

exprations里存的是 这一分钟里的所有的key,是set结构的

@EnableRedisHttpSession 设置默认的过期事件是30分钟
@RedisHttpSessionConfiguration 设置web服务没分钟的0秒去redis请求该分钟内的过期的key
SpringHttpSessionConfiguration 定义了SessionRepositoryFilter
SessionRepositoryFilter里进行了Request 和 Response的包装
在这里插入图片描述
getSession的时候先从Reques里尝试 获取,如果没有将创建新Session
response对象commit()的时候将session信息保存到redis数据库
EnableRedisHttpSession 中有一个onMessage(),可以接收Redis的键空间通知,接收到通知后发送Session过期Event事件。

posted @ 2021-01-31 17:51  yu007  阅读(407)  评论(0)    收藏  举报