Spring-SESSION+Redis 实现Session共享

Posted pinghengxing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-SESSION+Redis 实现Session共享相关的知识,希望对你有一定的参考价值。

Spring-SESSION+Redis 实现Session共享

  通常情况下,Tomcat的Servlet容器会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个常用的选择,但是随着服务器数量的增多,这种方法变得不容易扩展,因此需要进行session共享。

关于session共享的方式有多种:

(1)通过nginx的ip_hash,根据ip将请求分配到对应的服务器

(2)基于关系型数据库存储

(3)基于cookie存储

(4)服务器内置的session复制域

(5)基于nosql(memcache、redis都可以)

  常用的就是1和5,下面研究第5种方式,基于nosql(redis)存储session。

 

下边基于springboot进行session共享配置:

1、pom.xml中引入Redis相关的依赖

 

        <!--        缓存数据库相关-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <!--spring-session-redis sessiong共享       -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>    

 

 2、配置 application.properties

 

#配置spring_session共享redis
#Redis
spring.redis.host=140.143.XX.XX
## Redis服务器连接端口
spring.redis.port=6379
## 连接超时时间(毫秒)
spring.redis.timeout=300ms
## Redis服务器连接密码(默认为空)
spring.redis.password=ww

 

 3、设置Redis配置,并开启session缓存

 

@EnableRedisHttpSession
public class RedisSessionConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Value("${spring.redis.password}")
    private String redisPassword;


    /**
     * 配置连接工厂
     * @return
     */
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisHost, redisPort);
        redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPassword));
        return new JedisConnectionFactory(redisStandaloneConfiguration);
    }

}

4、编写一个Controller并进行测试

 

@RestController
public class RedisSessionTestController {


    @RequestMapping(value = "/sessionInsert")
    public  String insert(String key,String value, HttpSession session){
        session.setAttribute(key,value);
        return "success";
    }

    @RequestMapping(value = "/sessionGet")
    public  String delete(String key,HttpSession session){
        String value = (String) session.getAttribute(key);
        return key+":"+ value;
    }
}

 

 

启动两个服务进行测试,端口分别为8000 ,8001,两台服务均可获取到session

 测试结果:

 

以上是关于Spring-SESSION+Redis 实现Session共享的主要内容,如果未能解决你的问题,请参考以下文章

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

spring-session实现session共享案例(单点登录)

原保存一下之前spring-session的redis单点登录配置文件跨域

将 spring-session 和 Redis 添加到现有的 Spring Boot Spring Security 配置中

Spring-session整合到Redis

Spring-data-redis 的实现原理