分布式集群Session共享问题解决方案-@EnableRedisHttpSession
使用redis数据库存储session代替本地存储session
@EnableRedisHttpSession
- 使用存储本地服务器的方式和使用存储Redis数据库的方式 都需要支持
HttpSessionEvent
HttpSessionEvent
主要包含三个事件- 创建事件
- 过期事件
(过期用户自动登出)
- 销毁事件
- 使用本地存储的时候,可以使用设置监听的方式,监听事件的发生,从而做出相应的处理
- 使用
Redis
存储的时候,需要使用的KeySpce Notification
键空间通知
Spring Session
原理示意图
Spring session在数据库中的存储形式
spring session 在redis数据库中会存在三个key如上图所示:exprations
、sessions
、expires
Redis + Spring session数据结构及作用
Redis触发过期事件的方式
redis 需要触发过期事件,才能向spring服务端发送键空间通知
redis session的最大的延迟事件是1分钟
- 客户端访问的时候发现key过期
- redis在一定事件间隔频率在后台逐步查找过期键
如果仅用上述两个redis自带的机制无法保证key的过期事件抵达后立即生成过期事件。
通过添加key的方式实现及时过期session的需求![在这里插入图片描述](https://img-blog.csdnimg.cn/20210131145830613.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3OTUxMDI=,size_16,color_FFFFFF,t_70)
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
事件。