前言
当项目使用分布式时,session问题就显得比较突出了,因为有不同服务器的缘故,如果你安照一般方式存储session,那么你的session会保存在某一台服务器上,如果你的下一个请求并不是访问这台服务器,那么会发生读取不到session的情况。
解决方案
session replication 和 session sticky
session replication 策略是复制会话,即bai一个用户访问了一次就把session复制到所有的服务器或这一部分服务器。这样的好处是如果正访问的服务器down了用户可以自动被转到别的服务器session不丢失。缺点当然是效率低。
session sticky策略则是不复制,一个用户访问了一次后,同一个session周期内,所有的请求都定向到这个服务器,down了session就丢了
cookie
不过这种方式是十分不可取了,先不说session数据放到客户端那边造成的安全问题,这样会造成带宽消耗,而且会强烈影响性能,而且cookie自身也有长度限制。
集中化处理
你可以存在数据库中,也可以采用其他分布式存储系统,这里session的储存引入了网络操作,所以可能会有数据延迟,而且当session储存设备挂了,会造成所有session丢失
redis储存方案
容器
一般都是通过容器插件来实现,例如基于Tomcat的tomcat-redis-session-manager,基于Jetty的jetty-session-redis等等。好处是对项目来说是透明的,无需更改代码,但是目前还不支持Tomcat8。个人觉得由于过于依赖容器,,一旦更换容器或者容器升级,那又得重新来过。而且代码并不在项目中,对于开发者的维护也是个麻烦。
自定义工具类
第二种是自定义会话管理的工具类,这样的话灵活性很大,可以根据自身需求来实现,但是需要额外的开发时间