文档章节

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

红薯
 红薯
发布于 09/21 01:28
字数 965
阅读 1665
收藏 51

做 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 即可。例如:

<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 点个赞吧?

© 著作权归作者所有

共有 人打赏支持
红薯

红薯

粉丝 20824
博文 131
码字总数 47521
作品 8
深圳
产品经理
私信 提问
加载中

评论(12)

风云一哥
风云一哥

引用来自“talent-tan”的评论

为了推广j2cache,招了一批人,做了OSC社区,为了托管j2cache,开发了码云。这就是红薯��������
要说豪,还是程序员豪
bboss
bboss
https://www.oschina.net/p/bboss-session
大家也可以玩玩bboss session😄
talent-tan
talent-tan

引用来自“红薯”的评论

引用来自“tengyz”的评论

请问做session共享,用户量上了100w,存放本地内存里面不直接内存溢出了吗?请问大神这个怎么解决的?

内存里缓存可以配置存储上限的

引用来自“talent-tan”的评论

配上限是一个方案,同时,如果发现是两级缓存,本地缓存时间的过期时间不应超过10-30分钟,tio-utils就是这两种策略一起合作的
见:https://my.oschina.net/talenttan/tweet/18369019
talent-tan
talent-tan

引用来自“红薯”的评论

引用来自“tengyz”的评论

请问做session共享,用户量上了100w,存放本地内存里面不直接内存溢出了吗?请问大神这个怎么解决的?

内存里缓存可以配置存储上限的
配上限是一个方案,同时,如果发现是两级缓存,本地缓存时间的过期时间不应超过10-30分钟,tio-utils就是这两种策略一起合作的
Raphael_goh
Raphael_goh

引用来自“tengyz”的评论

请问做session共享,用户量上了100w,存放本地内存里面不直接内存溢出了吗?请问大神这个怎么解决的?

一般本地缓存都会配缓存淘汰策略,比如LRU、LFU、存储上限、定时淘汰等等,无限制容易出问题。
tengyz
tengyz
有时间试试你这个,我现在就遇到这样高并发场景,redis哨兵模式,集群模式,现在安装了codis,压测登录接口放入会话信息,codis投入了6台物理机,qps在100w,登录接口勉强10w tps,如果采用你这种方式可以大大减少redis成本和维护成本,明天试试
红薯
红薯

引用来自“tengyz”的评论

请问做session共享,用户量上了100w,存放本地内存里面不直接内存溢出了吗?请问大神这个怎么解决的?

内存里缓存可以配置存储上限的
tengyz
tengyz
请问做session共享,用户量上了100w,存放本地内存里面不直接内存溢出了吗?请问大神这个怎么解决的?
talent-tan
talent-tan
为了推广j2cache,招了一批人,做了OSC社区,为了托管j2cache,开发了码云。这就是红薯��������
blu10ph
blu10ph
这个好方便~
J2Cache 新增 Hibernate 5 支持,感谢 @tandy 贡献

想了解 J2Cache 是一个什么开源项目,请阅读 这篇博客。 J2Cache 刚新增对 Hibernate 5 的支持,提供了 j2cache-hibernate5 模块,可以方便在 Hibernate 5 中启用 J2Cache 缓存。 该模块由 ...

红薯
09/28
1K
10
J2Cache 2.6.0 发布,支持分布式 session 存储管理

J2Cache 2.6.0 版本发布啦,该版本最最值得关注的就是支持分布式的 session 存储管理,支持不同的 Servlet 容器。 此外,该版本包含了如下小改动: 配置中对值包含空格的处理 CacheObject 允...

红薯
09/13
1K
29
J2Cache 2.7.0 发布了,支持 Lettuce 替代 Jedis

J2Cache 2.7.0 在周末悄没声息的发布了!!! 该版本支持使用 Lettuce 替代 Jedis 连接 Redis ,目前二者并存,以后的版本可能会考虑直接替换掉 Jedis 。我之前不喜欢 Lettuce 是因为它依赖了...

红薯
09/15
1K
18
j2cache-shiro 1.0.0 发布,更新至 J2Cache 1.3.0

j2cache-shiro 1.0.0 发布了,依赖最新的 j2cache 1.3.0。 j2cache-shiro 实现 Shiro 的 CacheManager,使其能使用 J2Cache 作为 session 缓存。 配置方法 shiro.ini 中加入下面配置项即可 ...

wendal
2015/11/05
2.2K
13
Jboot v1.2.3 新增 J2Cache 适配及限流功能

Jboot是一个基于JFinal 和 undertow开发的微服务框架。提供了AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing数据追踪、metrics数据监控、分布式session、代码生成器、s...

理工男海哥
01/04
769
7

没有更多内容

加载失败,请刷新页面

加载更多

window下安装maven

1.下载软件包: 2.解压到当前的安装路径: D:\Maven3.5.3 3.添加环境变量: 新建一个名为:MAVEN_HOME 填写解压路径:D:\Maven3.5.3 打开path,添加:%MAVEN_HOME%\bin 确定即可。 4.验证环境...

狼王黄师傅
8分钟前
0
0
聊聊flink的FsCheckpointStorage

序 本文主要研究一下flink的FsCheckpointStorage CheckpointStorage flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/CheckpointStorage.java /** * CheckpointStor......

go4it
30分钟前
2
0
makefile 常用函数

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。今天我们来学习下makefile的常用函数。 《GNU make》h...

科陆李明
今天
17
0
Android 报错 Could not find com.android.tools.build:aapt2:3.2.1-4818971.

报错信息: Could not find com.android.tools.build:aapt2:3.2.1-4818971.Searched in the following locations: file:/C:/Users/96110/AppData/Local/Android/Sdk/extras/m2reposito......

lanyu96
今天
9
0
我的Linux系统九阴真经

我的Linux系统九阴真经 在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行...

linuxCool
今天
34
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部