tomcat集群会话信息存放到redis集群

Tomcat 与 Redis 结合做 Session 管理的本质,是让 Tomcat 把原本本地内存中的 StandardManager 替换为一个分布式的 RedisSessionManager,所有节点共享同一个 Redis,实现真正的横向扩展

Tomcat 装 Session Manager 模块 → 修改 server.xml → 配置 Redis → 重启验证 → 多节点压测。

步骤一:准备 Redis 环境

  1. 单节点环境可先跑 Redis(不过生产必须 Redis Cluster / Sentinel)。

  2. 业务上需要注意:Redis 配持久化 RDB+AOF 或至少 AOF appendfsync everysec,避免宕机丢会话。

步骤二:下载 Redis Session Manager 组件**

1.通用选型:

tomcat-redis-session-manager(vanilla)  
或 redisson-tomcat

建议 redisson-tomcat,维护积极、性能好。

  1. 下载对应版本(以 Tomcat 9 为例):
    放置文件:
redisson-all-x.x.x.jar  
redisson-tomcat-9-x.x.x.jar

复制到:

$CATALINA_HOME/lib/

步骤三:创建 Redisson 配置文件

  1. 文件路径:
$CATALINA_HOME/conf/redisson.conf
  1. 单机示例:
1
2
3
4
5
6
7
{
"singleServerConfig":{
"address": "redis://127.0.0.1:6379",
"password": "",
"database": 0
}
}
  1. 集群示例:
1
2
3
4
5
6
7
8
9
10
11
{
"clusterServersConfig": {
"nodeAddresses": [
"redis://10.0.0.11:6379",
"redis://10.0.0.12:6379",
"redis://10.0.0.13:6379"
],
"password": "",
"scanInterval": 2000
}
}

步骤四:修改 Tomcat 的 server.xml**

  1. 打开配置:
$CATALINA_HOME/conf/server.xml
  1. <Context> 中加入 Redisson Session Manager(注意不要放错位置,只能放在 Host 下的 Context):
1
2
3
4
5
6
7
<Context>
<Manager className="org.redisson.tomcat.RedissonSessionManager"
configPath="${catalina.base}/conf/redisson.conf"
readMode="REDIS"
updateMode="DEFAULT"
keyPrefix="tomcat_session:" />
</Context>

参数说明:

  1. readMode:
    READ → 所有 Session 从 Redis 获取(一致性好,但性能一般)
    MEMORY → 本地缓存 + Redis(性能高,但一致性弱)

  2. updateMode:
    DEFAULT → session.setAttribute 时才更新
    AFTER_REQUEST → 每次请求结束同步,最安全

  3. keyPrefix:区分不同 Tomcat 集群的 Namespace

步骤五:重启 Tomcat 验证**

  1. 观察日志是否载入:
INFO o.r.tomcat.RedissonSessionManager - RedissonSessionManager started
  1. 通过 redis-cli 确认会话是否写进 Redis:
keys tomcat_session:*
  1. 访问应用 → 换节点访问 → 验证 Session 一致性。

步骤六:典型双节点架构图**

flowchart LR
  A[用户请求] --> LB[负载均衡器]
  LB --> T1[Tomcat-1]
  LB --> T2[Tomcat-2]
  T1 --> R[(Redis Cluster)]
  T2 --> R

优化点

  • 不要使用黏性会话(sticky session),否则 Redis 功能无意义。

  • 在高并发场景,readMode=MEMORY updateMode=AFTER_REQUEST 是最佳平衡。

  • Redis 需要设置 timeout=3000ms 以上,避免偶发网络抖动让 Session 丢失。

  • 若 Session 大小 > 10KB,要考虑拆分或外置,因为 Redis 会话存储成本会变高。

  • Kubernetes 场景中,要确保 Tomcat Pod 滚动升级时 terminationGracePeriodSeconds 足够大,避免未刷新的 Session 丢失。