跳转至

分布式 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,服务端验签。

{
  "sub": "user123",
  "exp": 1735689600,
  "roles": ["admin"]
}
  • 优点:完全无状态,适合微服务、跨域。
  • 缺点:无法主动失效(要配合 Redis 黑名单);体积大。

三、方案选择

方案 适用
Session 复制 小规模集群
Sticky 老系统快速上集群
Redis Session 传统 Web 应用,主流
JWT 前后端分离、微服务、APP

四、Redis Session 注意点

  1. 设置合理过期时间。
  2. Redis 要高可用(哨兵 / Cluster)。
  3. Session 序列化方式(JDK / JSON)。
  4. 集群间 session 不要共用,按业务隔离。

面试加分

  • JWT 不能主动 logout 的问题:服务端维护一个 Redis 黑名单,登出时把 Token 加进去。
  • JWT 续签:快过期时刷新 Token。