首页 > 新闻中心> 广州校区 >正文

哪里的java培训比较好?欢迎咨询粤嵌java培训课程

更新时间: 2018-09-21 15:15:40来源: java培训

    Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在内存中保存 session 数据。这样做会有两个不足:
    服务重启后 session 数据丢失
    应用做集群部署的时候,不同的节点无法共享 session 数据

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

java培训

    现在还有另外一种方案就是使用 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 数据是一致的。

免费预约试听课

推荐阅读