论坛首页 Java企业应用论坛

关于 tomcat 集群中 session 共享的三种方法

浏览 17497 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-05-20  


前两种均需要使用 memcached 或 redis 存储 session ,最后一种使用 terracotta 服务器共享。
建议使用 redis ,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,
不只是缓存 session ,还可以做其他用途,一举几得啊。

1、使用 filter 方法存储
这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于 tomcat ,而且实现的原理比较简单容易控制。
可以使用 memcached-session-filter
官方网址:http://code.google.com/p/memcached-session-filter/
官方介绍:解决集群环境下java web容器session共享,使用filter拦截器和memcached实现。在tomcat 6和websphere 8测试通过,现网并发2000,日PV量1100万。
暂不支持session event包括create destory 和 attribute change
东西很不错,体积很小,不过这个东东要和 spring 一起使用,而且要求存储到 memcached 的对象要实现 java 的序列化接口
大家也知道,java 本身的序列化性能也很一般。
我将其简单扩展了一下,不再依赖 spring ,并且利用 javolution 实现序列化,缓存的对象不再有限制。
暂时没有发现 redis 的实现,后面将自己实现使用 redis 存储并且序列化使用 kyro ,详细情况有时间再单独写出来。


2、使用 tomcat session manager 方法存储
这种方法服务器只能使用 tomcat ,但网上有针对 memcached 和 redis 实现,直接配置就行了。
memcached 实现:
网址:http://code.google.com/p/memcached-session-manager/
修改 tomcat 的 conf 目录下的 context.xml 文件:
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"   
  memcachedNodes="n1:localhost:11211 n2:localhost:11212"   
  failoverNodes="n2"   
  requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"   
  sessionBackupAsync="false"   
  sessionBackupTimeout="100"   
  transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"   
  copyCollectionsForSerialization="false"    />

以上是以 1.3 版为例子,需要用的 jar 包:
memcached-session-manager-1.3.0.jar
msm-javolution-serializer-1.3.0.jar
javolution-5.4.3.1.jar
memcached-2.4.2.jar

redis 实现:
网址:https://github.com/jcoleman/tomcat-redis-session-manager
同样修改 tomcat 的 conf 目录下的 context.xml 文件:
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
         host="localhost"
         port="6379"
         database="0"
         maxInactiveInterval="60"/>
以上是以 1.2 版为例子,需要用的 jar 包:
tomcat-redis-session-manager-1.2-tomcat-6.jar
jedis-2.1.0.jar
commons-pool-1.6.jar


3、使用 terracotta 服务器共享
这种方式配置有点复杂,大家到网上搜索一下吧。

以上配置成功后,前端使用 nginx 进行负载均衡就行了,同时使用 Gzip 压缩 和 静态文件缓存。


   发表时间:2014-05-24  
楼主,你此处的session共享是指应用服务器集群后,session保存在分布式缓存里,实现session的高可用是吧?
你的这种方式,能解决这个问题不“http://www.iteye.com/problems/101435”
0 请登录后投票
   发表时间:2014-05-26  
期待楼主,SESSION的 redis实现。
0 请登录后投票
   发表时间:2014-06-04   最后修改:2014-06-04
hngmduyi 写道
期待楼主,SESSION的 redis实现。


其实 redis 实现也很容易,下载Java客户端Jedis
增加:jedis.setex(sessionid, expiredtime, sessiondata)
删除:jedis.del(sessionid)
获取:jedis.get(sessionid)

用这三个方法替换 memcached 的三个功能相同的方法即可。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics