消息中间件——Redis—分布式Session共享(十)

前言

当项目使用分布式时,session问题就显得比较突出了,因为有不同服务器的缘故,如果你安照一般方式存储session,那么你的session会保存在某一台服务器上,如果你的下一个请求并不是访问这台服务器,那么会发生读取不到session的情况。

解决方案

session replication 和 session sticky

session replication 策略是复制会话,即bai一个用户访问了一次就把session复制到所有的服务器或这一部分服务器。这样的好处是如果正访问的服务器down了用户可以自动被转到别的服务器session不丢失。缺点当然是效率低。

session sticky策略则是不复制,一个用户访问了一次后,同一个session周期内,所有的请求都定向到这个服务器,down了session就丢了

不过这种方式是十分不可取了,先不说session数据放到客户端那边造成的安全问题,这样会造成带宽消耗,而且会强烈影响性能,而且cookie自身也有长度限制。

集中化处理

你可以存在数据库中,也可以采用其他分布式存储系统,这里session的储存引入了网络操作,所以可能会有数据延迟,而且当session储存设备挂了,会造成所有session丢失

redis储存方案

容器

一般都是通过容器插件来实现,例如基于Tomcat的tomcat-redis-session-manager,基于Jetty的jetty-session-redis等等。好处是对项目来说是透明的,无需更改代码,但是目前还不支持Tomcat8。个人觉得由于过于依赖容器,,一旦更换容器或者容器升级,那又得重新来过。而且代码并不在项目中,对于开发者的维护也是个麻烦。

使用容器拓展实现session redis存储

自定义工具类

第二种是自定义会话管理的工具类,这样的话灵活性很大,可以根据自身需求来实现,但是需要额外的开发时间

框架

Spring Session + Redis实现分布式Session共享

SpringBoot 一个依赖搞定 session 共享,没有比这更简单的方案了!

文章目录
  1. 1. 前言
  2. 2. 解决方案
    1. 2.1. session replication 和 session sticky
    2. 2.2. cookie
    3. 2.3. 集中化处理
  3. 3. redis储存方案
  4. 4. 容器
  5. 5. 自定义工具类
  6. 6. 框架
|