侧边栏壁纸
  • 累计撰写 27 篇文章
  • 累计创建 42 个标签
  • 累计收到 34 条评论

目 录CONTENT

文章目录

Redis实现共享Session

miykah
2023-06-30 / 0 评论 / 0 点赞 / 37 阅读 / 2903 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-12-11,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

基于Session实现登录存在的问题

在集群模式下,基于 Session 实现的登录就会出现问题。假设用户第一次登录的时候负载均衡到了服务器A,在服务器A进行了登录,登录信息也保存在了服务器A。当用户第二次访问的时候,负载均衡到了服务器B,此时服务器B的session中是没有用户的登录信息的,所以用户必须进行重新登录。这样会给用户体验带来很大影响。

早期解决方案:session拷贝,就是说虽然每个tomcat上都有不同的session,但是每当任意一台服务器的session修改时,都会同步给其他的Tomcat服务器的session,这样的话,就可以实现session的共享了。

但这种方案会有问题:(1)每台服务器中都有完整的一份session数据,服务器压力过大。(2)session拷贝数据时,可能会出现延迟。

所以咱们后来采用的方案都是基于Redis来完成,我们把session换成redis,redis数据本身就是共享的,就可以避免session共享的问题了。

可以自己使用 StringRedisTemplate 实现登录,将用户信息存入redis,前端返回 token。

但为了方便,可以直接集成 spring-session-data-redis。会自动将原本存到 session中的内容存到redis,实现共享session

Spring Boot 整合 Redis 实现共享Session

整合 spring-boot-starter-data-redis

  1. 引入依赖

    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <version>2.7.11</version>
    </dependency>
  2. 修改配置文件

    spring:
        redis:
          password: xxxxxx
          database: 0
          port: 6379
          host: xxx.xxx.xxx.xxx

整合 spring-session-data-redis

  1. 引入依赖

    <!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis -->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
        <version>2.7.0</version>
    </dependency>
  2. 修改配置文件

    spring:
        session:
          timeout: 86400 # 秒
          store-type: redis # 将 session 保存到 redis

此时用户登录后的 session 就会保存在 redis 中,集群环境下的登录问题就可以得到解决。

image-20230615201541406

image-20230615201551447

0

评论区