zoukankan      html  css  js  c++  java
  • 使用Tomcat+Redis来实现集群部署中的Session共享问题

    一、工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案:

    1、使用数据库来存储Session

    2、使用Cookie来存储Session

    3、使用Redis来存储Sesssion

    二、本文中主要讲一下第3种方案,也就是使用Redis来存储Session,Github中已经有该开源组件(tomcat-redis-session-manager),下面讲一下配置的步骤

    1、配置tomcat配置文件context.xml

    <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />        
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" 
        host="localhost"             <!-- Redis地址 -->
        port="6379"                  <!-- Redis端口 -->
        password="123456"            <!-- Redis密码 -->
        database="0"                 <!-- 存储Session的Redis库编号 -->
        maxInactiveInterval="60"     <!-- Session失效的间隔(秒) -->
        />
    

      

    注:

    1)Manager节点中的className属性为必选项,其它均为可选项

    2)maxInactiveInterval设置不生效,暂时找不到原因,在部署中发现Session失效的间隔一直都是读取tomcat/conf/web.xml中的session-config节点中配置的session-timeout属性值,且都是以秒为单位(如有知道问题原因所在的,麻烦告诉我一声,非常感谢)

    2、添加相关的jar包到tomcat/lib目录下,需要的jar包如下:

    commons-pool2-2.2.jar
    jedis-2.5.2.jar
    tomcat-redis-session-manage-tomcat7.jar

     

    注:

    1)我将这些jar包上传到了百度云盘中,有需要的可以点击下载:http://pan.baidu.com/s/1bokMOVH

    3、在nginx中配置负载均衡,配置文件为nginx.conf

    http {
    upstream myServer {
    server 192.168.1.2:8080;
    server 192.168.1.3:8080;
    }
    server {
    listen 80;
    server_name www.kolbe.cn;
    location / {
    proxy_pass http://myServer;
    }
    }
    

      

    配置完后,访问www.kolbe.cn的请求都将被转发到192.168.1.2:8080以及192.168.1.3:8080中去,可以在页面中打印一下Session Id验证一下

    Session Id : <%= request.getSession().getId() %>

    当然,也可以到Redis库中直接查看

    注:

    1)GitHub中该开源组件(tomcat-redis-session-manager)的主页:https://github.com/jcoleman/tomcat-redis-session-manager

    2)该组件目前不支持Tomcat8,我用的是Tomcat 7.0.68版本

    3)在程序中将对象放到Redis里时,该对象必须实现java.io.Serializable接口,否则将报错,如果对象中有其它对象的引用,该引用对象也需实现java.io.Serializable接口,所以在使用request.getSession().setAttribute()方法时,一定要注意一下这一个细节

     

  • 相关阅读:
    linux中解压.tgz, .tar.gz ,zip ,gz, .tar文件
    hook(v16.7测试)?
    React优点?
    Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
    说说数据库连接池工作原理和实现方案?
    short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
    Oracle的数据优化(经常被问到)?
    存储过程和函数的区别?
    Collection 和 Collections的区别?
    说说数据库连接池工作原理和实现方案?
  • 原文地址:https://www.cnblogs.com/chyg/p/6322372.html
Copyright © 2011-2022 走看看