什么是spring session?

Spring Session provides an API and implementations for managing a user’s session information.

简单一句话,spring session帮你管理用户的session信息。

为什么使用spring session?

通常情况下,Tomcat、Jetty等Servlet容器,会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个非常好的方案。但是这种方案有一个缺点,就是不利于扩展。

目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等。那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享?

实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat、Jetty等服务器提供的Session共享功能,将Session的内容统一存储在一个数据库(如MySQL)或缓存(如Redis)中。

使用spring session有以下好处:

  spring session是开源的用户session管理软件,免费,易控且容易扩展;

  spring session可以使服务器无状态;

  服务器宕机或者重启不会丢失用户session信息,对用户更友好。

  不需要负载均衡器保持粘性

  满足应用和数据隔离原则

为什么使用spring session data redis呢?

  spring session提供了三种主要实现方式REDIS,JDBC,Hazelcast 

上一篇文章已经介绍了jdbc的实现  那为什么很多人更喜欢使用Redis实现呢?

  1.应用要求请求响应流畅,快捷,redis是内存服务器,响应很快

     2. 使用redis做外部存储,降低了对数据库或者服务器本身的依赖,更稳定

  3. redis的过期机制更友好

        4. redis的分片和集群机制,扩展性更好

         5. 简单应用且容易监控

         6. 和spring boot集成更紧密。

spring-session-data-redis实战

前段时间,写了篇<spring-session-data-redis解决session共享的问题>文章,介绍了spring-session使用redis存储实现session共享的内部机制,

有读者提问为什么只有理论没有实践?索性就实践一下。

1.使用sts创建spring-boot项目,项目名称session-jdbc,使用redis,web(方便测试)的start,创建完项目如下:

spring-session用redis实现session共享实践_服务器

 

2.增加spring-session-redis依赖

spring-session用redis实现session共享实践_redis_02

        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-security</artifactId> 
          </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
      </dependency>

spring-session用redis实现session共享实践_redis_02

3.配置属性

spring-session用redis实现session共享实践_redis_02

spring.session.store-type=redis
spring.redis.host=localhost
spring.redis.password=
spring.redis.port=6379
spring.session.redis.namespace=spring:session
spring.security.user.name=admin
spring.security.user.password=admin
spring.session.redis.cleanup-cron=0 * * * * *

spring-session用redis实现session共享实践_redis_02

4.增加测试类

spring-session用redis实现session共享实践_redis_02

package com.example.demo;import javax.servlet.http.HttpSession;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/redis")public class TestController {
    @RequestMapping("/welcome")    public String welcome(HttpSession httpSession) {
        httpSession.setAttribute("hello", "world");        return "hello world !";

    }
}

spring-session用redis实现session共享实践_redis_02

5.启动spring boot项目

spring-session用redis实现session共享实践_redis_08

6.访问http://localhost:8080/redis/welcome

 访问前查看redis情况

spring-session用redis实现session共享实践_spring_09

 

输入用户名密码 admin/admin

spring-session用redis实现session共享实践_spring_10

 

访问后

 spring-session用redis实现session共享实践_负载均衡_11

 

总结:

  spring-session-data-redis 使用redis做用户管理的存储,主要有以下优点:

1.简单易用,用户友好

2.响应快

3.扩展性强

4.稳定性高

5.可监控