redis存储session

Session 共享

为什么需要共享?

为什么服务器 A 登录后,请求发到服务器 B,不认识该用户?

在分布式系统中,多个服务通常会部署在不同的服务器或不同的域名下。

如果每个服务都单独管理自己的 Session,那么在跨域或跨服务器请求时,用户的 Session 数据就无法共享,导致用户在访问其他服务时需要重新登录。

原因如下:

  1. 用户在 A 登录,所以 session(用户登录信息)存在了 A 上
  2. 结果请求 B 时,B 没有用户信息,所以不认识。

例如,假设有两个域名:

aaa.zwnsyw.com

bbb.zwnsyw.com

如果希望它们共享用户的登录状态,需要将 Session 数据存储在一个公共的地方(如 Redis),而不是存储在单独的服务器内存中。

如图:

938d7ecf-c797-4419-8630-ea111e1db659-e120e16a

解决方案: 共享存储 ,而不是把数据放到单台服务器的内存中

a30c2e11-db13-466e-af9e-34e59924f24b-865cce37

如何共享存储?

核心思想:把数据放到同一个地方去集中管理。

  1. Redis(基于内存的 K / V 数据库)此处选择 Redis,因为用户信息读取 / 是否登录的判断极其 频繁 ,Redis 基于内存,读写性能很高,简单的数据单机 qps 5w - 10w。
  2. MySQL
  3. 文件服务器 ceph

使用 Redis 存储 Session

Redis 是一个高性能的内存存储系统,非常适合存储 Session 数据,因为它可以提供快速的读写操作。

下载redis

redis: redis存储session 默认端口6379

quick redis:redis存储session

配置

引入依赖

<!-- 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.6.4</version>
</dependency>

<!-- 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.6.3</version>
</dependency>

修改applicationyml

  # redis 配置

  redis:

    port: 6379

    host: localhost

    database: 1
  • redis.host:Redis 服务器的主机地址(默认 localhost)。
  • redis.port:Redis 服务器的端口(默认 6379)。
  • redis.database:选择 Redis 数据库,这里选择了 1,可以根据需求调整。

application.yml 中加入以下配置来启用 Spring Session 将 Session 存储到 Redis:

  session:

    timeout: 86400

    store-type: redis

store-type 设置为 redis,表示 Spring Session 将从 Redis 读写 Session 数据。

默认是 none,表示存储在单台服务器

store-type: redis,表示从 redis 读写 session

session.timeout:Session 过期时间,单位为秒。这里设置为 86400 秒(即 1 天)

完整:

spring:

  profiles:

    active: dev

  application:

    name: bankend

  datasource:

    url: jdbc:mariadb://localhost:3306/friendmarry?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

    username: root

    password: zw200495

    driver-class-name: org.mariadb.jdbc.Driver

  # 接口文档swagger配置

  mvc:

    pathmatch:

      matching-strategy: ANT_PATH_MATCHER

  # redis 配置

  redis:

    port: 6379

    host: localhost

    database: 1

  # session 失效时间

  session:

    timeout: 86400

    store-type: redis

server:

  port: 8080

  servlet:

    context-path: /api

mybatis-plus:

  configuration:

    #    关闭驼峰与下划线映射

    map-underscore-to-camel-case: false

  global-config:

    db-config:

      logic-delete-field: isDelete # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)

      logic-delete-value: 1 # 逻辑已删除值(默认为 1)

      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

项目分区导航:⬅️ 06-初始化项目 | 07-redis存储session | ➡️ 08-前言