--- title: "07-redis存储session" created: 2025-12-02 tags: - 项目 aliases: - redis存储session --- # 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.png]] 解决方案: **共享存储** ,而不是把数据放到单台服务器的内存中 ![[a30c2e11-db13-466e-af9e-34e59924f24b-865cce37.png]] ## 如何共享存储? 核心思想:把数据放到同一个地方去集中管理。 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]] ### 配置 #### 引入依赖 ```xml org.springframework.boot spring-boot-starter-data-redis 2.6.4 org.springframework.session spring-session-data-redis 2.6.3 ``` #### 修改applicationyml ```yaml # 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: ```yaml session: timeout: 86400 store-type: redis ``` `store-type` 设置为 `redis`,表示 Spring Session 将从 Redis 读写 Session 数据。 默认是 none,表示存储在单台服务器 store-type: redis,表示从 redis 读写 session `session.timeout`:Session 过期时间,单位为秒。这里设置为 86400 秒(即 1 天) 完整: ```yaml 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-初始化项目|06-初始化项目]] | 07-redis存储session | ➡️ [[08-前言|08-前言]]