如何通过 J2Cache 实现分布式 session 存储
做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在内存中保存 session 数据。这样做会有两个不足:
1.服务重启后 session 数据丢失
2.应用做集群部署的时候,不同的节点无法共享 session 数据
我们以使用比例最高的 Tomcat 为例,针对第二个问题 Tomcat 提供了集群 session 复制的解决方案,详情请看官方文档。看完文档你会发现 Tomcat 自带的方法配置非常复杂,而且它没有解决第一个问题 —— 服务重启导致 session 数据丢失的问题。
现在还有另外一种方案就是使用 memcached 或者是 redis 来存储 session 数据,于是就有了这么一些开源项目:
- https://www.oschina.net/p/tomcat-redis-session-manager
- https://www.oschina.net/p/redis-manager
- https://www.oschina.net/p/memcached-session-manager
这些开源项目使用和配置都比较简单,而且对应用完全透明,只需要在 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 数据是一致的。
本文来自云栖社区合作伙伴“开源中国”
本文作者:王练

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java常见面试题总结
Java常见面试题总结 @Date 2016.06.22 Java基础知识 1.Java 中应该使用什么数据类型来代表价格? 如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型。 2.怎么将 byte 转换为String,以及注意点? 可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。 3.我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象? 可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 128。 4.clone方法在哪个类中?Cloneable 还是 Object? java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。并且需要知道 clone() 方法是一个本地...
- 下一篇
不学无数——JAVA中NIO再深入
JAVA中NIO再深入 在上一章节的JAVA中的I/O和NIO我们学习了如何使用NIO,接下来再深入了解一下关于NIO的知识。 缓冲器内部的细节 Buffer由数据和可以高效地访问及操作这些数据的四个索引组成。这四个索引是 mark:标记,就像游戏中设置了一个存档一样,可以调用reset()方法进行回归到mark标记的地方。 position:位置,其实缓冲器实际上就是一个美化过的数组,从通道中读取数据就是放到了底层的数组。所以其实就像索引一样。所以positon变量跟踪已经写了多少数据。 limit:界限,即表明还有多少数据需要取出,或者还有多少空间能够写入。 capacity:容量,表明缓冲器中可以存储的最大容量。 在缓冲器中每一个读写操作都会改变缓冲器的状态,用于反应所发生的变化。通过记录和跟踪这些变化,缓冲器就能够内部地管理自己的资源。下面是用于设置和复位索引以及查询其索引值的方法 方法名 解释 capacity() 返回缓冲器的容量 clear() 清空缓冲器,将position设置为0,limit设置容量。调用此方法复写缓冲器 flip() 将limit设置为positio...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8编译安装MySQL8.0.19
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器