分布式 Session 有哪些实现方案?¶
一、为什么需要分布式 Session¶
单体应用 Session 存在服务器内存中。集群部署后,同一用户的两次请求可能落到不同机器,Session 不一致。
二、方案对比¶
方案 1:Session 复制¶
每个 Web 节点都复制 Session,任意一台都有全量 Session。
- 优点:应用无侵入。
- 缺点:内存浪费,节点多了同步开销大。
方案 2:Sticky(粘性会话)¶
负载均衡器把同一用户的请求固定分发到同一台机器(按 cookie / IP hash)。
- 优点:简单。
- 缺点:某台机器挂了,上面用户全部掉线;扩容后分布不均。
方案 3:集中式 Session(Redis)¶
Session 存到 Redis,所有 Web 节点共享。
- 优点:无状态应用,节点可随意扩缩。
- 缺点:多一次 Redis 访问。
Spring Session 实现:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
加注解 @EnableRedisHttpSession,Session 自动存 Redis。
方案 4:JWT(无状态 Token)¶
服务端不存 Session,登录后签发 Token,客户端每次带 Token,服务端验签。
- 优点:完全无状态,适合微服务、跨域。
- 缺点:无法主动失效(要配合 Redis 黑名单);体积大。
三、方案选择¶
| 方案 | 适用 |
|---|---|
| Session 复制 | 小规模集群 |
| Sticky | 老系统快速上集群 |
| Redis Session | 传统 Web 应用,主流 |
| JWT | 前后端分离、微服务、APP |
四、Redis Session 注意点¶
- 设置合理过期时间。
- Redis 要高可用(哨兵 / Cluster)。
- Session 序列化方式(JDK / JSON)。
- 集群间 session 不要共用,按业务隔离。
面试加分
- JWT 不能主动 logout 的问题:服务端维护一个 Redis 黑名单,登出时把 Token 加进去。
- JWT 续签:快过期时刷新 Token。