如何通过 J2Cache 实现分布式 session 存储
做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在内存中保存 session 数据。这样做会有两个不足:
- 服务重启后 session 数据丢失
- 应用做集群部署的时候,不同的节点无法共享 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 即可。例如:
<Context> ... <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211" sticky="false" sessionBackupAsync="false" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context>
但是这几个开源项目都有一个最根本的问题没法解决,当存放在 session 中的数据量比较大,而且读取 session 数据非常频繁时会导致 memcached 或者是 redis 吞吐量受带宽限制使得性能变得非常差。逼迫你必须通过 memcached 或者 redis 的扩容和集群来解决问题,大大的增加了硬件投入的成本和运维的成本。
--------
那么用 J2Cache 的 session-manager 模块就可以有效解决前面提到的所有问题。J2Cache 在 redis 的基础上引入了内存缓存的概念,可以确保服务重启后 session 数据不会丢失,其次极大的降低了 redis 的数据吞吐量,保证在高并发情况下依然有很好的性能表现。
与前面提到的几个开源项目不同,J2Cache 的 session manager 采用 Filter 方式实现,支持各种 Java 的 Web 容器服务。
使用方法:
1. Web 项目添加 J2Cache 的 session-manager 模块依赖:
<dependency> <groupId>net.oschina.j2cache</groupId> <artifactId>j2cache-session-manager</artifactId> <version>1.0.0-beta4</version> </dependency>
2. 在 web.xml 中配置 Filter:
<filter> <filter-name>j2cache-session-filter</filter-name> <filter-class>net.oschina.j2cache.session.J2CacheSessionFilter</filter-class> <init-param><!-- 内存中存放会话数 --> <param-name>session.maxSizeInMemory</param-name> <param-value>2000</param-value> </init-param> <init-param><!-- 会话有效期,单位:秒钟 --> <param-name>session.maxAge</param-name> <param-value>1800</param-value> </init-param> <!-- cookie configuration --> <init-param> <param-name>cookie.name</param-name> <param-value>J2CACHE_SESSION_ID</param-value> </init-param> <init-param> <param-name>cookie.path</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>cookie.domain</param-name> <param-value></param-value> </init-param> <!-- redis configuration --> <init-param> <param-name>redis.mode</param-name> <param-value>single</param-value> </init-param> <init-param> <param-name>redis.hosts</param-name> <param-value>127.0.0.1:6379</param-value> </init-param> <init-param> <param-name>redis.channel</param-name> <param-value>j2cache</param-value> </init-param> <init-param> <param-name>redis.cluster_name</param-name> <param-value>j2cache</param-value> </init-param> <init-param> <param-name>redis.timeout</param-name> <param-value>2000</param-value> </init-param> <init-param> <param-name>redis.password</param-name> <param-value></param-value> </init-param> <init-param> <param-name>redis.database</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>redis.maxTotal</param-name> <param-value>100</param-value> </init-param> <init-param> <param-name>redis.maxIdle</param-name> <param-value>10</param-value> </init-param> <init-param> <param-name>redis.minIdle</param-name> <param-value>1</param-value> </init-param> </filter> <filter-mapping> <filter-name>j2cache-session-filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. 启动应用,即可开启分布式 session 存储。
当重启 Web 应用时,内存中的 session 数据为空,会自动从 redis 中读取重启前保存的 session 数据。所有节点又通过 redis 进行 session 数据的共享,当有 session 数据更新时会通过 Redis Pub/Sub 来通知其他节点重新从 Redis 中读取数据,确保不同节点的 session 数据是一致的。
sesson-manager 模块代码 https://gitee.com/ld/J2Cache/tree/master/modules/session-manager
很简单吧? 去 https://gitee.com/ld/J2Cache 点个赞吧?
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
深度有趣 | 18 二次元头像生成
简介 和CelebA类似,使用ACGAN生成二次元头像,并且用多个条件进行控制 数据 图片爬取自http://getchu.com/,是一个日本二次元游戏网站,包含大量游戏人物立绘,共爬取31,970张 头像截取 之前介绍的dlib可用于提取人脸,但不适用于二次元头像 使用OpenCV从每张图片中截取头像部分,用到以下项目,https://github.com/nagadomi/lbpcascade_animeface 对于检测结果适当放大范围,以包含更多人物细节 # -*- coding: utf-8 -*- import cv2 cascade = cv2.CascadeClassifier('lbpcascade_animeface.xml') image = cv2.imread('imgs/二次元头像示例.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = cv2.equalizeHist(gray) faces = cascade.detectMultiScale(gray, scaleFactor=1.1...
- 下一篇
Loadrunner11如何使用非IE浏览器录制脚本
下面提到的loadrunner11版本是经过汉化后的,所以界面是汉化版的。下面的教程也适用于高版本的IE。 如何安装、汉化、破解可以参考下我之前的文章:LoadRunner11在win7下的安装、破解、汉化 1、打开Virtual User Generator (VuGen) 2、新建脚本,进入脚本协议选择页面:选择单协议脚本下的Web (HTTP/HTML) 3、点击创建按钮,进入空白脚本的创建页面 4、点击左边导航栏的录制应用程序中的开始录制 5、进入开始录制配置页面 这里需要修改配置,在应用程序类型中选择Win32 应用程序这一项,在要录制的程序中选择loadrunner11安装目录下bin目录中的 wplus_init_wsock.exe,程序参数输入你的测试链接地址,工作目录尽量选loadrunner11安装目录下bin目录(不选这个也没事),然后点击左下角的选项按钮进入录制选项配置界面: 在端口映射中,点击新建条目来添加代理配置: 注:我这里使用的http并没有使用https,所以没有使用ssl配置,如果你有需要,可以选择ssl。 目标服务器 目标服务器IP 端口 目标服务...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器