Nginx +redis 负载均衡 会话共享(二):redis的安装以及session共享的实现

5 篇文章 0 订阅
3 篇文章 0 订阅

首先这时候 应该已经nginx 负载均衡配置成功了, 然后卡到session共享问题 用户无法登陆。

Nginx 的安装与负载均衡配置 详解

本文使用 Windows 环境进行测试,Tomcat 8.0

redis 安装与配置

redis官网

windows 的下载是要到GitHub上的 windows 链接

解压好的 如图所示
这里写图片描述

设置redis 的密码
打开配置文件 redis.windows-service.conf

找到配置 #requirepass foobared 去掉注释 然后将后面的改为 自己设置的密码
设置redis为系统服务
cmd 进入redis目录
1.
设置 redis 为win 系统服务
redis-server –service-install redis.windows-service.conf –loglevel verbose

2.
卸载服务:redis-server –service-uninstall

开启服务:redis-server –service-start

停止服务:redis-server –service-stop

为了方便 下载一个redis 数据库客户端管理程序 redis desktop manager

这里写图片描述

输入ip 和端口号 加密码 端口号 默认的话是6379 密码没设置的话 可以不填写。。 我们看到了 已经连接redis了 并且可以看到16个库了

到了现在 就差整合redis 进自己项目里了 本文介绍2种方式:

1.使用spring-sesssion-redis 相当于是将session交给了spring 去管理。 大概是 spring 有一个过滤器 用户请求至项目的时候 这个session过滤器 会将session 过滤掉,封装一次 在返回到项目里。据说是无缝集成 httpSession的

2.使用Tomcat-session-redis 相当于是Tomcat在处理session的时候 将session 存储到统一的一个地方(redis里) 然后程序去读session的时候也是 Tomcat会去Redis里寻找session信息,遗憾的是 这个jar 15年的时候 已经是最后一次更新了,仅仅支持到Tomcat7 ,但是 Tomcat8的处理 需要改一部分源代码 就可以实现了。

一个是程序去处理 每次请求 都要进行一次spring 封装session, 一个是web容器去处理。 使用Tomcat session redis 的时候还要多余三个jar 直接放到Tomcat lib里 而且相当于 Tomcat下部署的所有项目的session 都要推送到redis里

一.Spring MVC 整合 redis

 1.0 引入jar包
         <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
            <version>1.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.1</version>
        </dependency>

更新下maven 配置

 1.1 添加配置文件
 在resources文件夹中新建一个redis.properties ,新建spring-redis.xml 配置redis 连接池 以及 session有效期。更改 web.xml 追加spring session 过滤器。 有说法是 这个过滤器要加在最上边  但是实测 这个是无所谓的,都可以实现的

 redis.properties  配置地址 端口号 密码  超时时间 
redis_hostName=xx.xxx.xxx.xxx
redis_port=6379
redis_password = xxxxx
redis_timeout = 20000
spring-redis.xml 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- session设置 -->
    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="3600"></property>
    </bean>
    <!-- redis连接池 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="100" />
        <property name="maxIdle" value="10" />
    </bean>

    <!-- redis连接工厂 -->
    <bean id="connectionFactory"class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis_hostName}"/>
        <property name="port" value="${redis_port}"/>
        <property name="password" value="${redis_password}"/>
        <property name="timeout" value="${redis_timeout}"/>
        <property name="usePool" value="true"/>
        <property name="poolConfig" ref="poolConfig"></property>
    </bean>


</beans>

然后需要在 springmvc 配置文件中引入 redis.properties,以及在web.xml 中加载配置文件spring-redis.xml 和设置spring session 管理

web.xml

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml,classpath:spring-redis.xml</param-value>
    </context-param>
    <!--session过滤器-->
    <filter>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

配置已经结束,此时项目启动的时候 session已经交给spring 去管理。 登录redis查看 session信息已经存在

注意 :直接存储对象的时候 需要将对象进行序列化

项目本地 没有启动 就不截图项目了。
这里写图片描述

二,Tomcat 整合redis

   大概思路: 设置Tomcat 下的配置context.xml  将redis的信息写入配置文件。 然后利用 commons-pool2-2.0.jar jedis-2.5.2.jar 以及 tomcat8_redis_session_manage.jar 

    tomcat—redis-session.jar 官方已经在三年前不维护了。更新停止到Tomcat7  至于Tomcat8 是要自己改代码的。 所以最后一个jar 的名字也不固定。都是大家自己修改的

首先 这是 官方jar

修改的源代码:RedisSessionManager.java

    @SuppressWarnings("deprecation")
    private void initializeSerializer() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        log.info("Attempting to use serializer :" + serializationStrategyClass);
        serializer = (Serializer) Class.forName(serializationStrategyClass).newInstance();

        Loader loader = null;

        if (getContainer() != null) {
            loader = getContainer().getLoader();
        }

        ClassLoader classLoader = null;

        if (loader != null) {
            classLoader = loader.getClassLoader();
        }
        serializer.setClassLoader(classLoader);
    }

修改后的内容

    private void initializeSerializer() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        log.info("Attempting to use serializer :" + serializationStrategyClass);
        serializer = (Serializer) Class.forName(serializationStrategyClass).newInstance();

        Loader loader = null;
        Context context = this.getContext();
        if (context != null) {
            loader = context.getLoader();
        }

        ClassLoader classLoader = null;

        if (loader != null) {
            classLoader = loader.getClassLoader();
        }
        serializer.setClassLoader(classLoader);
    }
之后打 jar包 、、 当然这三个jar  在网上好多地方可以下载的

修改Tomcat 的配置文件 context.xml  将redis的信息写入配置文件 注意配置文件中的包名 要和改的tomcat8 jar包里的报名是一致的。 否则会报找不到类 错误
添加
<Valve className="com.demo.redis_session.RedisSessionHandlerValve" />  
    <Manager className="com.demo.redis_session.RedisSessionManager" 
      host="xx.xxx.xxx.xxx"
      port="6379"
      database="0"
      password = "xxxx"
      maxInactiveInterval="60"
    />
 将三个jar 拷贝 至 Tomcat lib 文件夹下 重启Tomcat  打开 nginx  查看 信息 发现已经有了数据,nginx里存的 信息 key 是sessionid了 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值