大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

spring-session-data-redis共享方案

可以关注我的个人博客和公众号,第一时间发布最新的干货文章

个人博客网站:www.spacedong.top
微信公众号:spacedong

正文

传统的解决方案

在传统的 HTTP session 解决方案中,session 是存储在 JVM 的堆内存中。这个 JVM 和运行代码的 JVM 是一样的。

  • 优点:
    • 可以快速部署在多个服务器实例中。
    • 动态地增加或者减少服务器的实例。
  • 缺点:
    • 在动态增加或者减少了服务器实例后,需要 HTTP session 重新平衡。这里会消耗大量的资源。
    • 存储 HTTP session 的时候,需要消耗大量的堆内存,会给 GC 时带来性能瓶颈。

现在的解决方案

为了解决在传统的 HTTP session 管理方案中的问题,需要把 session 存储在独立的数据结构中,如:Redis、Memcache等缓存中,让 session 实现共享。

实践

  • 准备Spring - session
准备 Spring - session

1、第一步:添加依赖包

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>2.0.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

2、第二步: web.xml 文件中添加 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>  

3、第三步:编写 spring-redis 的配置文件,根据自己的配置来具体设置。

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" />

    <bean id="redisHttpSessionConfiguration"
        class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="3600" />
    </bean>

    <bean id="jedisConnectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
        destroy-method="destroy">
        //redis的主机名
        <property name="hostName" value="${redis.host}" />
        //redis的连接端口
        <property name="port" value="${redis.port}" />
        //连接超时时间
        <property name="timeout" value="${redis.timeout}" />
        <property name="usePool" value="true" />
        <property name="poolConfig" ref="jedisPoolConfig" />
        //这里是redis中的数据库的设置,默认是存在第一个库中
        <property name="database" value="0"/>
    </bean>

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
    </bean>

4、第四步:在 Spring.xml 的配置文件中设置

<!-- Redis的配置-->
<import resource="classpath:spring-redis.xml"/>
现在就可以完成关于spring-session的共享了,后续可能还涉及到Nginx的负载均衡等,请期待下篇文章。

想要获得更多的优质技术文章,可以关注下方的微信公众号 spacedong

为优质的文章而赞赏,这是为作者能持续输出的最大肯定!