在讲解redis分布式session共享之前,我们先聊聊tomcat中session管理机制,包括:请求过程中session操作,sessionid解析过程,servlet获取session流程,以及tomca中session的管理机制。

Tomcat session管理机制

请求过程中的session操作:

在请求过程中首先要解析请求中的sessionid信息,然后将sessionid存储到request的参数列表中。然后再从request获取session的时候,如果存在sessionid那么就根据id从session池中获取session,如果sessionid不存在或者sesssion失效,那么则新建session并且将session信息放入session池,供下次使用。

sessionid解析过程(web工程引入tomcat jar包可debug调试):

用户发送一个http请求传递给Http11Processor,经由Http11Processor解析封装在org.apache.coyote.Request然后传递给CoyoteAdapter,CoyoteAdapter是一个适配器,将coyote框架封装的org.apache.coyote.Request适配给org.apache.catalina.connector.Request,转换完之后会调用parsePathParameters方法区解析路径参数中的cookie信息,先尝试从url中解析出sessionid,然后会调用parseSessionCookiesId,这个就是从cookie中解析sessionid存在request。解析到sessionid就放到了request里面,解析sessionid的逻辑就ok了。

servlet获取session的流程:

servlet通过request获取session的时候,其实调用的是HttpServletRequest(其实是RequestFacade,封装了Request的一个门面),然后RequestFacade会调用真是得Request的getSession方法。Request具体逻辑是调用Context容器的getManger方法获取session管理器,然后如果sessionid如果被解析出来了,那么则会调用findSession方法从session对象池中获取对应的session,反之如果sessionid不存在,则需要重新创建一个session,并放入session对象池中。

session管理机制:

session管理器组件负责管理session对象,eg:常见和销毁session对象

(1)Manager:定义了关联到某一个容器的用来管理session池的基本接口。

(2)ManagerBase:实现了Manager接口,该类提供了Session管理器的常见功能的实现。

(3)StandardManager:继承自ManagerBase,tomcat的默认Session管理器(不指定配置,默认使用这个),是tomcat处理session的非集群实现(也就说是单机版的),tomcat关闭时,内存session信息会持久化到磁盘保存为SESSION.ser,再次启动时恢复。

(4)PersistentManagerBase:继承自ManagerBase,实现了和定义了session管理器持久化的基础功能。

(5) PersistentManager:继承自PersistentManagerBase,主要实现的功能是会把空闲的会话对象(通过设定超时时间)交换到磁盘上。

(6)ClusterManager:实现了Manager接口,通过类名应该能猜到,这个就是管理集群session的管理器和上面那个StandardManager单机版的session管理器是相对的概念。这个类定义类集群间session的复制共享接口。

(7)ClusterManagerBase:实现了ClusterManager接口,继承自ManagerBase。该类实现了session复制的基本操作。

(8)BackupManager:继承自ClusterManagerBase, 集群间session复制策略的一种实现,会话数据只有一个备份节点,这个备份节点的位置集群中所有节点都可见。这种设计使它有个优势就是支持异构部署。

(9)DeltaManager:继承自ClusterManagerBase,集群建session复制策略的一种实现,和BackupManager不同的是,会话数据会复制到集群中所有的成员节点,这也就要求集群中所有节点必须同构,必须部署相同的应用。

Redis分布式session配置

分布式session原理

如上图,多实例下可以使用redis实现分布式session管理,客户端请求,经过负载均衡分发至tomcat实例,再经过session管理,实现session在redis中存取。配置redis主从集群,主redis数据热备份至从redis,当主redis宕机了,系统自动切换至从redis,从而保证系统缓存方面高可用。

一言不合上代码,就是任性...

redis配置

可以使用spring-redis.xml作为redis配置文件名,首先配置redis缓存池:

再配置redis模板引擎redisTemplat:

```

配置分布式session过滤器

springSessionFilter

org.springframework.web.filter.DelegatingFilterProx

targetBeanName

springSession

web.xml中配置分布式session过滤器,初始化bean name是springSession;将需要用到分布式session请求配置至过滤器中,代码如下:

springSessionFilter

/shoppingcart/*

springSessionFilter

/my/*

redis session配置

配置分布式session管理bean(SessionRepositoryFilter.java),经过第二步过滤器的请求,都会经过这个管理bean,配置SessionRepositoryFilter.java默认构造函数是redis session操作仓RedisOperationsSessionRepository.java。

p:port="${redis.port.session}"p:hostName="${redis.host.session}"

p:password="${redis.password.session}" p:poolConfigref="jedisPoolConfig" />

redis如何实现session分布式存取在下一节介绍。

分布式session请求流程

上一节介绍了spring mvc框架下redis session系统配置管理,下面我将会redis中session请求流程进行介绍。

如上一节所述,经过过滤器的请求,进入SessionRepositoryFilter,其默认使用RedisOperationsSessionRepository作为构造函数参数。

默认使用RedisOperationsSessionRepository作为构造函数参数

进入分布式session过滤器,SessionRepositoryFilter执行doFilterInternal方法,类似Filter中的doFilter(),在单个请求线程中只调用一个请求。doFilterInternal()执行doFilter操作后,再执行session commit操作wrappedRequest.commitSession();

commitSession.png

commitSession方法中,sessionRepository.save(session)调用RedisOperationsSessionRepository的save()方法,将session以key value形式存放到redis中。

获取session时,SessionRepositoryFilter调用getSession()方法,方法内部S session = sessionRepository.getSession(requestedSessionId);调用RedisOperationsSessionRepository的getSession()方法,从redis中获取session。具体RedisOperationsSessionRepository如果将session存取值redis,不再讲述,可以查阅源码。

尊重版权:

参考文档:Tomcat中session的管理机制

博主知识短浅,如有错误疏漏,请各位简客批评指正。

java redis实现session共享_redis实现分布式session共享相关推荐

  1. Spring Boot(十一)Redis集成从Docker安装到分布式Session共享

    2019独角兽企业重金招聘Python工程师标准>>> 一.简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并 ...

  2. 【学习笔记】cookie、session、token和分布式session

    文章目录 cookie和Session session和token cookie和token总结 分布式Session cookie和Session 为什么要有session的出现? 答:是由于网络中 ...

  3. session传递参数_分布式 Session 之 Spring Session 架构与设计

    作者 | 李增光 杏仁后端工程师.「只有变秃,才能变强!」 ​前言 开始进行 Web 开发时,我们可能会遇到这样的情况,当服务器重启之后,之前的登录状态会失效需要重新登录.又或者你的应用程序部署了不止 ...

  4. java redis set 过期时间_redis分布式锁自动延长过期时间

    分布式系统概念与设计(原书第5版) 93.8元 包邮 (需用券) 去购买 > 背景项目组已经有个分布式锁注解(参考前文<记一次分布式锁注解化>),但是在设置锁过期时间时,需要去预估业 ...

  5. java redis设置过期时间_Redis的一些核心原理

    点关注,不迷路:持续更新Java相关技术及资讯!!! 一.Redis的单线程和高性能 Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,所有的运算都是内存级别的运算(纳秒),而且单线程 ...

  6. java redis缓存工具类_redis工具类-JedisUtil

    redis连接的工具类 1.java中的redis java中,使用redis不会将其当作数据库来使用,更多的是作为缓存或者是消息中间件来使用.在用作缓存时,我们需要使用第三方提供的jar包来进行开发 ...

  7. java redis 断线重连_redis断线重连代码详解

    redis断线重连代码详解 发布时间:2020-05-08 17:59:39 来源:亿速云 阅读:459 作者:Leah redis断线怎么重连?这个问题可能是我们日常工作经常遇到的.本篇文章主要探讨 ...

  8. java redis 重连机制_redis在java中的客户端连接

    单例模式下创建连接池,包括断线重连等机制. public class RedisClient { private static JedisPool pool = null; private Redis ...

  9. 分布式Session共享的4类技术方案,与优劣势比较

    分布式Session共享的4类技术方案,与优劣势比较 什么是session 什么是session一致性问题? 分布式session Session一致性解决方案 1.什么是session 服务器为每个 ...

最新文章

  1. android 6.0谷歌,Android 6.0来了!谷歌月底要发布Android M系统
  2. seaborn系列 (16) | 变量关系组图pairplot()
  3. Vue使用全局样式,页面没有发生变化:逗号是中文的,引起错误,样式不变化 也没有报错就是不起作用
  4. 4.4.4 字符串数据处理
  5. java参数类型不同_java – 两种不同的参数类型(将Object强制转换为Type)
  6. 程序员编程艺术:第三章续、Top K算法问题的实现
  7. esp8266对接天猫精灵 微信控制
  8. linux监控工具 go实现,安装和使用gotop进行Linux系统进程监控的方法
  9. C++:初始值设定项
  10. 《德鲁克管理思想精要》读书笔记3 - 管理的新范式?
  11. java 二进制报文头_使用Netty收发二进制报文问题记
  12. html请求资源不可用,HTTP状态404 – 请求的资源(/)不可用
  13. Python检测数据不完整的JPG图片
  14. Kubernetes 污点与容忍
  15. 荣耀V30系列正式发布,它有满足你对5G手机的期待吗?
  16. Android应用添加谷歌登录(Google Sign In)
  17. IP地址更改小工具(bat命令)
  18. Centos7 搭建DNS服务器与原理配置详解
  19. 21省人均GDP超过1万美元,北京以19.01万元继续稳居榜首
  20. 战舰V3适配oneos系列03:添加SD卡驱动及文件系统

热门文章

  1. c++软开需要的知识
  2. 中国元宇宙第一人最早元宇宙布道者元宇宙先驱高泽龙的观点集锦
  3. PPLive计划私募融资2000万美元
  4. Java (JDK和JRE安装)简单粗暴
  5. 魁北克移民扫盲及申请条件
  6. 如何加速百度云盘上传速度
  7. [python] Pelican+Mermaid无插件实现
  8. 从三季报中读浙商银行的金融服务价值
  9. 月亮网摘(2006.08.25)
  10. SQL注入-联合查询注入