Spring Session

spring+redis自主实现分布式session(非spring-session方式)

巧了我就是萌 提交于 2019-11-30 19:01:40
背景:最近对一个老项目进行改造,使其支持多机部署,其中最关键的一点就是实现多机session共享。项目有多老呢,jdk版本是1.6,spring版本是3.2,jedis版本是2.2。 1.方案的确定 接到这项目任务后,理所当然地google了,一搜索,发现解决方案分为两大类: tomcat的session管理 spring-session 对于“tomcat的session管理”,很不幸,线上代码用的是resin,直接pass了; 对于“spring-session”,这是spring全家桶系列,项目中正好使用了spring,可以很方便集成,并且原业务代码不用做任何发动,似乎是个不错的选择。但是,在引入spring-session过程中发生了意外:项目中使用的jedis版本不支持!项目中使用的jedis版本是2.2,而spring-session中使用的jedis版本是2.5,有些命令像"set PX/EX NX/XX",项目中使用的redis是不支持的,但spring-session引入的jedis支持,直接引入的话,风险难以把控,而升级项目中的redis版本的话,代价就比较高了。 综上所述,以上两个方案都行不能,既然第三方组件行不通,那就只能自主实现了。 通过参考一些开源项目的实现,自主实现分布式session的关键点有以下几点:

springboot集成springsession利用redis来实现session共享

风流意气都作罢 提交于 2019-11-30 02:22:31
spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下: Java代码 @Configuration @EnableRedisHttpSession public class RedisSessionConfig { } 而@EnableRedisHttpSession这个注解是由spring-session-data-redis提供的,所以在pom.xml文件中添加: Java代码 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> 接下来,则需要在application.properties中配置redis服务器的位置了,在这里,我们就用本机: Java代码 spring.redis.host=localhost spring.redis.port=6379

SpringBoot实现分布式session

主宰稳场 提交于 2019-11-29 18:20:36
实现分布式session 实现基于redis的分布式session 原理 基于HttpRequestWapper,对request获取的Session实现类进行替换,即提供一个从redis获取数据的Session实现类 依赖 引入 spring-boot-starter-data-redis 、 spring-session-data-redis ; 引入 kryo 作为序列化方案 <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.esotericsoftware</groupId> <artifactId>kryo</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>de

Spring-Session基于Redis管理Session

戏子无情 提交于 2019-11-29 15:27:21
系列文章 Nginx+Tomcat关于Session的管理 Tomcat Session管理分析 Spring-Session基于Redis管理Session 前言 在上文 Tomcat Session管理分析 介绍了使用tomcat-redis-session-manager来集中式管理session,其中一个局限性就是必须使用tomcat容器;本文介绍的spring-session也能实现session的集中式管理,并且不局限于某种容器; spring-session管理session实战 1.maven依赖的jar <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.3.1.RELEASE</version> <type>pom</type> </dependency> <dependency> <groupId>biz.paluch.redis</groupId> <artifactId>lettuce</artifactId> <version>3.5.0.Final</version> </dependency> <dependency> <groupId>org

spring+redis 实现 session 共享

末鹿安然 提交于 2019-11-29 15:27:09
使用Nginx+Tomcat进行负载均衡时,希望使用轮询方式进行负载。但是如果使用轮询方式的话,可能会访问不同的Tomcat,此时如果不进行Session共享,则相当于是一个新的Session。就比如现有 系统 都是需要认证登录的系统,如果没有Session共享,则会导致用户退出登录 目前实现 session 共享的方式有以下几种: 1、使用Tomcat内置的Session复制方案 只适合Tomcat小集群,不适合大集群,因为session复制是all to all的方式 2、使用第三方(个人)基于Tomcat实现的Session管理 第三方支持,支持力度不够,尤其是不能提供对Tomcat8的支持 3、使用Spring Session实现 本文介绍的是第三种解决办法,即使用 spring session + redis 的方案 一、引入 pom <!-- 使用Spring Session来解决Session共享问题 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.3.0.RELEASE</version> <type>pom</type> </dependency>

spring-session(一)揭秘

拥有回忆 提交于 2019-11-29 13:54:19
前言 在开始spring-session揭秘之前,先做下热脑(活动活动脑子)运动。主要从以下三个方面进行热脑: 为什么要spring-session 比较traditional-session方案和spring-session方案 JSR340规范与spring-session的透明继承 一.为什么要spring-session 在传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器管理。浏览器使用cookie中记录sessionId,容器根据sessionId判断用户是否存在会话session。这里的限制是,session存储在web容器中,被单台服务器容器管理。 但是网站主键演变,分布式应用和集群是趋势(提高性能)。此时用户的请求可能被负载分发至不同的服务器,此时传统的web容器管理用户会话session的方式即行不通。除非集群或者分布式web应用能够共享session,尽管tomcat等支持这样做。但是这样存在以下两点问题: 需要侵入web容器,提高问题的复杂 web容器之间共享session,集群机器之间势必要交互耦合 基于这些,必须提供新的可靠的集群分布式/集群session的解决方案,突破traditional-session单机限制(即web容器session方式,下面简称traditional-session)

【转载】spring-session负载均衡原理分析

两盒软妹~` 提交于 2019-11-29 09:18:26
注明转载: https://www.jianshu.com/p/beaf18704c3c 第一部分: 我会用循序渐进的方式来展示源码,从大家最熟悉的地方入手,而不是直接从系统启动来debug源码。直接debug源码看到后来大家都会一头雾水。 本文先从request.getSession()开始剖析源码,目标是让读者清楚的知晓Spring-session的产生过程。 第二部分: 再上一部分 Spring-session的产生过程 的研究中如果读者清楚了整个过程的脉络,那么肯定会产生一些疑惑:Servlet容器如何从默认的Session切换到Spring-session?为什么request.getSession()会直接调用Spring的session管理方案?这一块研究结束后整个Spring-session的大体原理分析就结束了。 剩下的就是其他一些策略的问题,篇幅有限,不再展开。读者可以私下研究或者评论区域我们讨论。比如 1.CookieHttpSessionStrategy和HeaderHttpSessionStrategy的区别 2.Session创建成功后存储到session仓库的具体过程? ... 那么,先从第一部分开始 一. 提出问题假设 Spring-Session 的思路是替换Servlet容器提供的HttpSession。在web程序中通过调用方法 request

便宜有便宜的办法-小微企业云上的springboot集群方案2.1:redis的消息订阅和session过期机制

妖精的绣舞 提交于 2019-11-29 09:04:31
1、session在redis里面的存储结构2 在 上一章 讲spring session存储到redis的时候,在redis里面看到每一个session存储都会生成三条记录,记录格式如下: 这就很麻烦了,为啥不能一一对应,做彼此的天使呢,搞的一对三,很影响风化啊。到底是道德的沦丧还是人性的扭曲,让我们走进redis,看下具体的数据内容: 第一个k-v存储这个Session的id,是一个Set类型的Redis数据结构。这个key中的最后的1570550340000值是一个时间戳,根据这个Session过期时刻滚动至下一分钟而计算得出。里面的值是这样的 第二个k-v用来表示Session在Redis中的过期,是个String类型,这个k-v不存储任何有用数据,只是表示Session过期而设置。这个key在Redis中的过期时间即为Session的过期时间间隔 第三个k-v用来存储Session的详细信息,是hash类型,包括Session的创建时间、过期时间间隔、最近的访问时间、attributes等等。这个k的过期时间为Session的最大过期时间 + 5分钟。如果默认的最大过期时间为30分钟,则这个k的过期时间为35分钟 说到这里,会有个灵魂的拷问,就一个session的存储,为啥要搞三条记录?这里要提一下HttpSession的接口规范了。 session虽然也是一条数据

便宜有便宜的办法-小微企业云上的springboot集群方案2:session和redis

我与影子孤独终老i 提交于 2019-11-29 08:02:25
在谈到集群方案的时候,第一个会遇到的问题就是session问题,在单机上,session的问题从来都是web容器解决的,我们主要是用,但是集群意味着多容器。如果负载均衡是随机分配服务器访问的话,很容易造成在A服务器登录后,下次访问是走的是B服务器,结果B服务器的web容器里面并没有该用户的session,结果就悲剧了。那么怎么办呢,当然是redis来处理,redis把session集中存储起来,不管哪台服务器存取session都是走redis,本地服务器不保存session,这个问题就完美的解决了。这个方案落到具体的实现上,首先我想到的就是spring自己的解决方案,spring session。 1、spring session+redis跑起来 spring session+redis的方案非常的简单,大家请按步骤来: 步骤1:pom文件加starter <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter

Springboot+redis实现session共享

别等时光非礼了梦想. 提交于 2019-11-29 04:44:05
当多个应用做集群的时候,如何实现应用之间session共享。 解决办法: 用一个容器保存 session,就能共享了。容器可以是数据库,缓存,文件等。当然这里性能最高的还是 redis了。 实例代码: pom文件中加入redis跟session <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> 在配置文件application.properties里配置 # Redis服务器地址 spring.redis.host=localhost # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= 加上端口号 server.port=8080 定义一个Controller @GetMapping("get") public Map