如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在内存中保存 session 数据。这样做会有两个不足:

1.服务重启后 session 数据丢失

2.应用做集群部署的时候,不同的节点无法共享 session 数据

我们以使用比例最高的 Tomcat 为例,针对第二个问题 Tomcat 提供了集群 session 复制的解决方案,详情请看官方文档。看完文档你会发现 Tomcat 自带的方法配置非常复杂,而且它没有解决第一个问题 —— 服务重启导致 session 数据丢失的问题。

现在还有另外一种方案就是使用 memcached 或者是 redis 来存储 session 数据,于是就有了这么一些开源项目:

这些开源项目使用和配置都比较简单,而且对应用完全透明,只需要在 server.xml 中配置好 Manager 即可。例如:

 
 

但是这几个开源项目都有一个最根本的问题没法解决,当存放在 session 中的数据量比较大,而且读取 session 数据非常频繁时会导致 memcached 或者是 redis 吞吐量受带宽限制使得性能变得非常差。逼迫你必须通过 memcached 或者 redis 的扩容和集群来解决问题,大大的增加了硬件投入的成本和运维的成本。

--------

那么用 J2Cache 的 session-manager 模块就可以有效解决前面提到的所有问题。J2Cache 在 redis 的基础上引入了内存缓存的概念,可以确保服务重启后 session 数据不会丢失,其次极大的降低了 redis 的数据吞吐量,保证在高并发情况下依然有很好的性能表现。

与前面提到的几个开源项目不同,J2Cache 的 session manager 采用 Filter 方式实现,支持各种 Java 的 Web 容器服务。

使用方法:

1. Web 项目添加 J2Cache 的 session-manager 模块依赖:

 
 

2. 在 web.xml 中配置 Filter:

 
 

3. 启动应用,即可开启分布式 session 存储。

当重启 Web 应用时,内存中的 session 数据为空,会自动从 redis 中读取重启前保存的 session 数据。所有节点又通过 redis 进行 session 数据的共享,当有 session 数据更新时会通过 Redis Pub/Sub 来通知其他节点重新从 Redis 中读取数据,确保不同节点的 session 数据是一致的。

本文来自云栖社区合作伙伴“开源中国”

本文作者:王练

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值