分布式Session

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

1、采用session sticky方式,但是这样会对负载均衡器造成相当大的负担,而且某太服务器挂了,会造成session丢失。

2、采用session replication方式,但是如果服务器数量一多,就造成了十分庞大的带宽开销,而且,如果很多客户端同时访问服务器的话,那么每台服务器都需要保存大量的session数据,而session数据时存储在内存中的,这样每台机器用户保存session数据占用内存就太多了。

3、cookie,这样方式十分不可取,session数据放到客户端造成安全问题,cookie本身长度也有限制,再加上有些网站支持移动终端等,使得采用cookie来进行session同步的方式弊端更为凸显。

4、session集中处理,可以存储在数据库中,也可以采用其他分布式存储系统,主要采用这种方式。

使用redis存储的实现方案有如下几种:

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

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

第三种使用框架的会话管理工具,例如spring-session,shiro等,可以理解是替换了servlet那一套会话管理工具,不依赖容器,不用改动代码。如果采用Spring-session的话,使用的是Spring-data-redis那一套连接池,前期是使用Spring框架。

redis分布式session:

分布式Session

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