Session共享问题:当搭建多节点Tomcat服务器集群时,多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题。
核心问题分析:
每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器的session中,但是第二次这个用户访问到了第二台tomcat,那么在第二台服务器上,肯定没有第一台服务器存放的session,所以此时整个登录拦截功能就会出现问题。

我们能如何解决这个问题呢?早期的方案是session拷贝,就是说虽然每个tomcat上都有不同的session,但是每当任意一台服务器的session修改时,都会同步给其他的tomcat服务器的session,这样的话,就可以实现session的共享了。
但是这种方案具有两个大问题:
- 每台服务器中都有完整的一份session数据,服务器压力过大,冗余备份问题。
- session拷贝数据时,可能会出现延迟,数据一致性存在问题
此时适合解决这个场景的方案需要满足三点:
- 数据共享
- 高并发下读写迅速
- 存储结构为key-value
由于Redis是基于内存存储,性能非常强,读写延迟基本在微秒级别。因此我们将session换成Redis存储数据,Redis脱离了tomcat存储数据,支持多台tomcat服务器共享数据,也就避免了session共享的问题。为了保证Redis数据不丢失,后期还可以考虑搭建Redis集群。