`
jaychang
  • 浏览: 738499 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

Tomcat7集群共享Session 基于redis进行统一管理

 
阅读更多

背景:

      很多时候,生产环境,需要多个tomcat协作,那么session的统一管理是一个首先需要解决的问题。session的统一管理有很多解决方案,比如存储至数据库、memcache、redis。那么我想给大家介绍的是将session存储至redis这个方案。

       先要感谢开源项目tomcat-redis-session-manager,感谢作者

 

实验环境:

操作系统:windows 7 64位

Redis版本:Redis 2.8.2101(Redis安装方法这里不介绍了,请自行Google、Baidu)

Tomcat版本:tomcat7.0.64(2个tomcat实例,注意同一台机器上试的话,启动另一个tomcat实例的时候需要修改端口号,如果是不同机器上的tomcat,那就不用修改了)

JDK版本:jdk1.7.0_80(生产环境请使用servre版本)

 

  请求监听端口 Shutdown监听端口 AJP监听端口
tomcat_1 8080 8005 8009
tomcat_2 8090 8015 8019

 

 

 

准备:

tomcat_1端口按照默认配置(不改server.xml)

 

tomcat_2端口改为下面的配置(修改server.xml)

 

<Server port="8015" shutdown="SHUTDOWN">
  <Service name="Catalina">   
    <Connector port="8090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
....
    <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
....
    </Service>
</Server>

 

 tomcat_1,tomcat_2都要修改contenxt.xml

 

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
  <Manager className="com.radiadesign.catalina.session.RedisSessionManager"
         host="localhost" 
         port="6379" 
         database="0" 
         maxInactiveInterval="60" />
 

 

  

 

 

 

下载所需jar包(为了方便大家,我在附件里上传了所有的jar包)

1)redis的java客户端

   https://github.com/xetorthio/jedis

 

2) tomcat-redis-session-manager的jar包,我用的是自己编译的(作者只给了gradle,⊙﹏⊙b汗没有maven的,我把它改成了maven工程的),见附件,源码也给到大家。

 

3) apache-commons-pool2

http://commons.apache.org/proper/commons-pool/download_pool.cgi

 

 

将下载好的jar包,放到tomcat_1\lib及tomcat_2\lib目录下,



 

 

开始实验:

首先开启redis服务 redis-server.exe redis.windows.conf



 

 

开启redis命令行客户端以便监视redis的状态变化,redis-cli -p 6379  monitor(如果有密码则 redis-cli -p 6379 -a mypass monitor

 

 

 分别通过catalina.bat run 开启tomcat_1,tomcat_2

 

   在命令行终端,看到了如下信息,表明redis的session manager初始化成功

...
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Attached to RedisSessionHandlerValve
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer
信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Will expire sessions after 1800 seconds
十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory E:\WorkFolder\Temp\Redis-Session\apache-tomcat1-8080\webapps\manag
十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory E:\WorkFolder\Temp\Redis-Session\apache-tomcat1-8080\webapps\ROOT
十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.TldConfig execute
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a co
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Attached to RedisSessionHandlerValve
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer
信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Will expire sessions after 1800 seconds
...

 

 然后我们分别在tomcat_1/webapp/ROOT,tomcat_2/webapp/ROOT下放setsession.jsp,getsession.jsp

 

setsession.jsp内容:

<%
  session.setAttribute("name","jaychang");
  session.setAttribute("id","1001");
%>

 

getsession.jsp内容:

<%=session.getAttribute("id")%>
ID:<%=session.getAttribute("name")%>
NAME:<%=session.getAttribute("id")%>

 

  好了,至此,你应该也明白了,现在要干嘛了,那么重点来了,见证奇迹的时刻到了!

 

打开浏览器,输入 http://127.0.0.1:8080/setsession.jsp回车




 
D741CDC41F66331883AAB70DC6252046就是SESSIONID

值为

\xac\xed\x00\x05w\b\x00\x00\x01Pj\xc8\xf5\xb2sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01Pj\xc8\xf5\xb2sq\x00~\x00\x00\x00\x00\x01Pj\xc8\xf5\xb2sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexq\x00~\x00\x01\x00\x00\a\bsr\x00\x11java.lang.Boolean\xcd r\x80\xd5\x9c\xfa\xee\x02\x00\x01Z\x00\x05valuexp\x01q\x00~\x00\asq\x00~\x00\x00\x00\x00\x01Pj\xc8\xf5\xb4t\x00 D741CDC41F66331883AAB70DC6252046sq\x00~\x00\x04\x00\x00\x00\x02t\x00\x04namet\x00\bjaychangt\x00\x02idt\x00\x041001

 最后我们看到了...jaychang ...1001

 

好了,那我们再看看getsession.jsp,先看tomcat_1的getsession.jsp




 

看下redis变化,get "D741CDC41F66331883AAB70DC6252046


 
 

 再看看tomcat_2的getsession.jsp,页面上获取到了




 
 
再看看redis的变化,又一次get "D741CDC41F66331883AAB70DC6252046"

 

 


 

 

获取的sessionId是同一个,说明成功了

待解决的问题:

java.lang.IllegalStateException: Race condition encountered: attempted to load session[32405E7F668A227E154AC6FF5E4A4F6A] which has been created but not yet serialized.
        at com.radiadesign.catalina.session.RedisSessionManager.loadSessionFromRedis(RedisSessionManager.java:389)
        at com.radiadesign.catalina.session.RedisSessionManager.findSession(RedisSessionManager.java:315)
        at org.apache.catalina.connector.Request.isRequestedSessionIdValid(Request.java:2460)
        at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1067)
        at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:754)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:418)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

   见:https://github.com/janrain/tomcat-redis-session-manager/blob/master/README.markdown  Possible Issues

 

参考:

https://github.com/jcoleman/tomcat-redis-session-manager

 

https://support.pivotal.io/hc/en-us/articles/206085337-How-to-setup-Redis-Session-Manager-on-tcServer-Tomcat

 

http://www.cnblogs.com/lengfo/p/4260363.html

 

  • 大小: 20.8 KB
  • 大小: 65.6 KB
  • 大小: 100.9 KB
  • 大小: 50.3 KB
  • 大小: 190 KB
  • 大小: 48.1 KB
  • 大小: 173.2 KB
  • 大小: 37.4 KB
  • 大小: 261.3 KB
  • 大小: 37 KB
  • 大小: 40.9 KB
分享到:
评论
6 楼 KitGavinx 2018-01-30  
跨顶级域名怎么保持sessionid一致?
5 楼 CPLASFYL 2017-02-18  
我已帮帮我吗,我的启动就报错
java.lang.ClassNotFoundException: com.radiadesign.catalina.session.RedisSessionHandlerValve
二月 18, 2017 2:25:22 上午 org.apache.catalina.startup.ContextConfig processContextConfig
严重: Occurred at line 33 column 81
4 楼 劍龍_long 2017-02-16  
还是楼主给力. 网上下的 tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar  与 commons-pool.jar 结合在一起
3 楼 2759862720 2016-12-26  
                                    
2 楼 2759862720 2016-12-26  
                                    
1 楼 2759862720 2016-12-26  
      非常好 ,感谢楼主分享,能使用

相关推荐

    Tomcat8(Tomcat9)+redis实现Session共享(支持Redis集群)

    本教程将详细介绍如何利用Tomcat 8或9以及Redis实现Session共享,支持Redis集群,以提高系统的可伸缩性和数据一致性。 首先,我们需要理解Session的概念。Session是服务器端用于存储用户状态的一种机制,通常在用户...

    tomcat8集群session共享(redis处理)

    "Tomcat8集群session共享(redis处理)"的主题正是针对这一问题,通过集成Redis作为分布式缓存来解决。下面我们将详细探讨这个过程。 首先,我们需要理解Session的概念。Session是在Web应用中用于跟踪用户状态的一...

    tomcat7 集群通过redis共享session 所需jar包

    在构建高可用的Tomcat7集群中,一个关键问题是如何在不同的服务器实例之间共享用户Session信息,以确保用户状态在集群中的无缝切换。在这种场景下,我们可以利用Redis作为中间件来实现Session的共享。以下是对这个...

    tomcat集群基于redis共享session使用到的jar包

    tomcat集群基于redis共享session使用到的所有jar包,放到tomcat的lib下即可使用 apache-tomcat-7.0.56+nginx-1.8.0+redis-3.0.6集群部署所需JAR包,session共享 tomcat-redis-session-manager1.2.jar jedis-2.6.2....

    tomcat7+redis集群 session共享jar

    通过这种方式,"tomcat7+redis集群 session共享jar"可以帮助开发者解决在Tomcat7集群中Session共享的问题,提升系统的可扩展性和可用性。在大型网站和分布式应用中,这样的解决方案能够保证用户在不同服务器之间切换...

    tomcat-redis集群,session共享

    tomcat-redis集群时session共享jar工具类,支持tomcat8

    tomcat7集群部署session统一由redis管理所需jar包

    总结一下,本压缩包提供的jar包和配置文件使得在Tomcat7集群环境中,session可以安全地存储在Redis中,实现跨节点的session共享。这样不仅解决了session丢失的问题,也提高了系统的可扩展性和可维护性。通过合理配置...

    tomcat8 redis集群 session共享 jar

    tomcat8 Redis集群 同步Session 中用到的jar 附带tomcat content.xml配置文件

    redis tomcat7 session共享

    本主题将深入探讨如何在`Tomcat7`中利用`Redis`进行Session共享。 **一、Redis简介** Redis是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它的数据模型包括字符串、哈希、列表、...

    适配与Tomcat7、8、9的redis session共享jar包

    "适配与Tomcat7、8、9的redis session共享jar包"指的是一个专为Apache Tomcat服务器设计的解决方案,用于在多台Tomcat服务器之间共享用户会话数据。这个解决方案主要依赖于Redis,一个高性能的键值存储系统,来存储...

    redis+tomcat集群配置session共享

    本篇文章将详细探讨如何在Redis+Tomcat集群配置中实现Session共享。 首先,我们需要理解什么是Session。Session是Web应用中用于存储用户状态的一种机制,通常用于保存用户的登录信息、购物车等数据。在单台服务器...

    Tomcat7集群扩展session集中管理,redis配置

    在Tomcat集群中,Redis可以作为一个中央session存储,确保session数据的一致性。 要实现Tomcat7与Redis的集成,我们需要几个关键组件: 1. **jedis-2.1.0.jar**:这是Java的Redis客户端库,用于与Redis服务器通信...

    tomcat8共享session之redis缓存

    通过以上步骤,我们可以实现Tomcat8集群中基于Redis的Session共享,从而提升应用的可用性和用户体验。这种方式不仅解决了Session丢失的问题,还有助于提高系统的扩展性,因为增加新的服务器时无需担心Session同步...

    tomcat7+jdk1.7+redis session共享;tomcat8+jdk1.8+redis session共享 jar包+配置文件

    这里的主题是利用Redis作为中间缓存来实现Tomcat集群中的session共享,这可以确保用户在集群中的任意一台服务器上登录后,其session信息能够在其他服务器上同样可用,从而提高系统的可扩展性和可用性。 首先,我们...

    session 共享 tomcat-redis-session-manager 所需要的jar (绝对可用)

    总结来说,这个压缩包提供了一套完整的解决方案,包括了连接Redis的Jedis客户端、对象池管理、Tomcat的Session管理器以及配置文件,使得开发者可以轻松地在Tomcat集群中实现Session共享,提升系统的可扩展性和容错性...

    tomcat 7 集群使用 redis 进行session共享所需jar

    tomcat 7 集群使用 redis 进行session共享所需 jar commons-pool-1.6.jar 、jedis-2.2.1.jar、 tomcat-redis-session-manager-1.2-tomcat-7.jar

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高...

    tomcat7集群实现session共享

    当我们谈论“Tomcat7集群实现session共享”时,我们关注的是如何在多个Tomcat实例之间有效地同步用户会话信息,以便在集群环境中提供高可用性和负载均衡。 首先,理解session共享的重要性。在Web应用中,session是...

    redis集群session共享jar包之tomcat7

    Redis 集群在Web应用中的使用,特别是与Tomcat7结合实现Session共享,是现代分布式系统中解决Session一致性问题的常见方案。本篇将详细探讨如何利用Redis集群来存储和共享Tomcat7应用程序的Session数据,以提高系统...

Global site tag (gtag.js) - Google Analytics