分布式session的问题(使用SpringSession和redis解决)

之前的代码在我们之后一台应用系统,所有操作都在一台Tomcat上,没有什么问题。当我们部署多台系统,配合Nginx的时候会出现用户登录的问题

原因
由于 Nginx 使用默认负载均衡策略(轮询),请求将会按照时间顺序逐一分发到后端应用上。
也就是说刚开始我们在 Tomcat1 登录之后,用户信息放在 Tomcat1 的 Session 里。过了一会,请求又被 Nginx 分发到了 Tomcat2 上,这时 Tomcat2 上 Session 里还没有用户信息,于是又要登录。
分布式session的问题(使用SpringSession和redis解决)_第1张图片

一:使用SpringSession去实现

1.导入依赖,进行配置,就可以在redis数据库中看到所储存的session
pom.xml


 <!-- spring-session 依赖 -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

application,yml

spring:
  # redis配置
  redis:
    #服务器地址
    host: 127.0.0.1
    #端口
    port: 6379
    #数据库
    database: 0
    #超时时间
    timeout: 10000ms
    lettuce:
      pool:
        #最大连接数,默认8
        max-active: 8
        #最大连接阻塞等待时间,默认-1
        max-wait: 10000ms
        #最大空闲连接,默认8
        max-idle: 200
        #最小空闲连接,默认0
        min-idle: 5

二:redis存储信息

1.redis序列化

/**
 * redis配置类
 */
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //key序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // hash序列化 
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // hash序列化 value序列化
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        //注入连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }

}

2.修改业务层代码
分布式session的问题(使用SpringSession和redis解决)_第2张图片
分布式session的问题(使用SpringSession和redis解决)_第3张图片
分布式session的问题(使用SpringSession和redis解决)_第4张图片
详细代码请看:代码

你可能感兴趣的:(SpringBoot,redis,分布式,数据库)