利用 Redis 存储 Session(Spring Session 实战)
1. 引入依赖
xml
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>2. 配置
yaml
spring:
redis:
host: redis-cluster.internal
port: 6379
password: ***
session:
store-type: redis # 关键开关
timeout: 1800 # 30 分钟过期
namespace: app:session # key 前缀
server:
servlet:
session:
cookie:
name: APPSESSIONID # 防止多个系统冲突3. 代码使用(与原生 Session 完全一致)
java
@RestController
public class LoginController {
@PostMapping("/login")
public Object login(@RequestBody LoginDTO dto, HttpSession session) {
User user = userService.verify(dto);
session.setAttribute("user", user); // 自动序列化到 Redis
return "ok";
}
@GetMapping("/api/profile")
public Object profile(HttpSession session) {
User user = (User) session.getAttribute("user");
return user;
}
}4. Redis 里长什么样
127.0.0.1:6379> keys app:session:*
1) "app:session:09c4f4b7-3d3e-4d9a-9439-7c3c3ce7b7af"
127.0.0.1:6379> type app:session:09c4f4b7...
hash
127.0.0.1:6379> hgetall app:session:09c4f4b7...
1) "sessionAttr:user"
2) "{\"@class\":\"com.xxx.User\",\"id\":1,\"name\":\"Tom\"}"TTL 30 分钟,续期策略:每次请求自动刷新 TTL(DefaultCookieSerializer 默认实现)
5. 高阶用法
- 自定义序列化:换成 JSON / Protobuf 减少体积
- 并发控制:
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800) - 多域共享:设置
cookie.domain=.example.com实现 SSO
四、面试金句
“负载均衡会话一致性两条路:
粘性哈希保节点,但扩缩容会丢;
Redis 集中存 Session 才是无状态王道,加 spring-session-data-redis 一行配置即可。”