背景:

很多时候,生产环境,需要多个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)

Xml代码

  1. <span style="line-height: 1.5; font-size: 18px;"><Server port="8015" shutdown="SHUTDOWN">
  2. <Service name="Catalina">
  3. <Connector port="8090" protocol="HTTP/1.1"
  4. connectionTimeout="20000"
  5. redirectPort="8443" />
  6. ....
  7. <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
  8. ....
  9. </Service>
  10. </Server></span>

tomcat_1,tomcat_2都要修改contenxt.xml

Xml代码

  1. <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
  2. <Manager className="com.radiadesign.catalina.session.RedisSessionManager"
  3. host="localhost"
  4. port="6379"
  5. database="0"
  6. 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初始化成功

Java代码

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

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

setsession.jsp内容:

Java代码

  1. <%
  2. session.setAttribute("name","jaychang");
  3. session.setAttribute("id","1001");
  4. %>

getsession.jsp内容:

Java代码

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

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

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


D741CDC41F66331883AAB70DC6252046就是SESSIONID

值为

Java代码

  1. \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是同一个,说明成功了

待解决的问题:

Xml代码

  1. java.lang.IllegalStateException: Race condition encountered: attempted to load session[32405E7F668A227E154AC6FF5E4A4F6A] which has been created but not yet serialized.
  2. at com.radiadesign.catalina.session.RedisSessionManager.loadSessionFromRedis(RedisSessionManager.java:389)
  3. at com.radiadesign.catalina.session.RedisSessionManager.findSession(RedisSessionManager.java:315)
  4. at org.apache.catalina.connector.Request.isRequestedSessionIdValid(Request.java:2460)
  5. at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1067)
  6. at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:754)
  7. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:418)
  8. at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
  9. at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
  10. at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
  11. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  12. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  13. 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

Tomcat7集群共享Session 基于redis进行统一管理(转)相关推荐

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

    背景: 很多时候,生产环境,需要多个tomcat协作,那么session的统一管理是一个首先需要解决的问题.session的统一管理有很多解决方案,比如存储至数据库.memcache.redis.那么 ...

  2. 集群共享session;shiro实现session共享;springboot实现redis共享session;

    shiro实现共享session;springboot集成redis共享session;集群环境下shiro共享session 一.实现session共享 1. 聊聊session共享 2. shir ...

  3. tomcat集群共享session

    [前言] 无数人撞的头破血流告诉我们的一个经验是一个网站如果不做负载后果是不堪设想:负载一是对请求进行分压不至于大流量过来把机器压垮,即使部分机器Down掉网站仍可用(高可用,防止单点故障). [负载 ...

  4. asp.net mvc 用Redis实现分布式集群共享Session。

    1.这两天研究Redis搞分布式session问题,网上找的资料都是用ServiceStack.Redis来实现的,但是在做性能测试的时候发现最新的v4版本有限制每小时候最多请求6000次,因为官网开 ...

  5. Redis + Tomcat + Nginx 集群实现 Session 共享

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 蕃薯耀 链接 | www.cnblogs.com/fan ...

  6. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    转载自  Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 一.Session共享使用tomcat-cluster-redis-session-mana ...

  7. Nginx+Tomcat+Memcached实现tomcat集群和session共享

    Nginx+Tomcat+Memcached实现tomcat集群和session共享 [http://blog.csdn.net/shimiso/article/details/8979044] 为什 ...

  8. Nginx+tomcat集群的session共享问题

    请求负载过程中会话信息不能丢失.那么需要在多个tomcat中session需要共享.所以需要进行相关问题的解决 配置Tomcat的session共享可以有三种解决方案: 第一种:是以负载均衡服务器本身 ...

  9. 用Redis存储Tomcat集群的Session

    用Redis存储Tomcat集群的Session 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推 ...

最新文章

  1. 一行命令搞定AD数据库备份
  2. 菜鸟学Linux 第050篇笔记 dhcp
  3. SAP系统和微信集成的系列教程之十:如何在SAP C4C系统里直接回复消息给微信用户
  4. Spring Boot错误errMsg: request:ok
  5. JavaScript萌新基础
  6. vue是否可以做行车轨迹_特斯拉-概念自行车,是否可以走进大众生活
  7. 酒店的月收入报表java_统计报表_宾馆明细收入报表
  8. JavaWeb开发——JSP技术
  9. pdf格式压缩大小,pdf如何压缩大小?
  10. 数控系统数据采集协同架构,集成马扎克(mazak)、西门子(Siemens)、海德汉(heidenhain)、广数、凯恩帝(knd)、三菱、海德汉、兄弟、哈斯、宝元、新代、发那科(Fanuc)、华中
  11. java实现上传寸照并剪裁,给寸照换背景_用java处置图片(jpg,png,gif.)的背景颜色
  12. 爬虫:Python爬取煎蛋网图片
  13. Eason Chan
  14. html中怎么让盒子模型居中,通过box盒子模型给元素内容设置居中
  15. 联想微型计算机B3O5,触摸电视功能 联想B3系列一体电脑评测
  16. 电池续航时间增10倍
  17. Excel应用技巧:不让别人修改你的Excel表
  18. pygame time.clock.tick
  19. Centos 7安装、配置SVN
  20. 2016 充实的一年

热门文章

  1. 三顶红帽子和两顶白(蓝)帽子。
  2. idea 链接github 无法成功登陆, SpringCloud Config 分布式配置中心配置
  3. 如何让手机自带路由器,24小时wifi跟着你!知道后你就是大神!
  4. 《MATLAB 神经网络43个案例分析》:第25章 基于MIV的神经网络变量筛选----基于BP神经网络的变量筛选
  5. linux 解压zip文件到指定文件夹,Linux解压文件到指定目录
  6. Mysql免安装版下载以及配置
  7. 3种局域网介质访问控制方法的比较
  8. 【2021版】想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(二)
  9. php ci cors,javascript-CORS请求在Safari中不起作用
  10. SPA项目开发之首页导航+左侧菜单