redis存储session
Session 共享
为什么需要共享?
为什么服务器 A 登录后,请求发到服务器 B,不认识该用户?
在分布式系统中,多个服务通常会部署在不同的服务器或不同的域名下。
如果每个服务都单独管理自己的 Session,那么在跨域或跨服务器请求时,用户的 Session 数据就无法共享,导致用户在访问其他服务时需要重新登录。
原因如下:
- 用户在 A 登录,所以 session(用户登录信息)存在了 A 上
- 结果请求 B 时,B 没有用户信息,所以不认识。
例如,假设有两个域名:
aaa.zwnsyw.com
bbb.zwnsyw.com
如果希望它们共享用户的登录状态,需要将 Session 数据存储在一个公共的地方(如 Redis),而不是存储在单独的服务器内存中。
如图:
解决方案: 共享存储 ,而不是把数据放到单台服务器的内存中
如何共享存储?
核心思想:把数据放到同一个地方去集中管理。
- Redis(基于内存的 K / V 数据库)此处选择 Redis,因为用户信息读取 / 是否登录的判断极其 频繁 ,Redis 基于内存,读写性能很高,简单的数据单机 qps 5w - 10w。
- MySQL
- 文件服务器 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)
💬 评论