---
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-前言]]