Tomcat 9.0.118 分布式 Redis Session 配置指南

Tomcat 9.0.118 分布式 Redis Session 配置指南

配置目标: 实现多台Tomcat集群部署的Session共享

一、Redis Session Manager 概述

1.1 功能特性

  • Session共享: 多台Tomcat共享Redis中的Session,支持集群部署
  • Session持久化: Session存储在Redis中,Tomcat重启不丢失
  • 高可用: Redis故障时可配置降级策略
  • 无侵入: 应用代码无需修改,Tomcat容器级配置

1.2 适用场景

  • 多实例集群部署
  • 负载均衡环境
  • 需要Session共享
  • 需要会话持久化

二、JAR包清单

2.1 核心JAR包

JAR包名称 版本 大小 说明
tomcat-cluster-redis-session-manager-4.0.jar 4.0 250KB Tomcat Redis Session Manager核心包

下载地址:

bash 复制代码
# GitHub官方下载
wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/4.0/tomcat-cluster-redis-session-manager-4.0.jar

安装位置 : $CATALINA_HOME/lib/


2.2 依赖JAR包

JAR包名称 版本 说明
jedis-3.10.0.jar 3.10.0 Redis Java客户端
commons-pool2-2.11.1.jar 2.11.1 连接池依赖

注意: Redis Session Manager 4.0 已经内置了这些依赖,无需额外下载。


2.3 Tomcat版本兼容性

Tomcat版本 Redis Session Manager版本 JAR包名称
Tomcat 8.5.x 3.0 tomcat-cluster-redis-session-manager-3.0.jar
Tomcat 9.0.x 4.0 tomcat-cluster-redis-session-manager-4.0.jar
Tomcat 10.0.x 5.0+ tomcat-cluster-redis-session-manager-5.0.jar

当前项目 : Tomcat 9.0.118 → 使用 4.0版本


三、安装配置步骤

3.1 下载并安装JAR包

bash 复制代码
# 1. 进入Tomcat lib目录
cd /path/to/tomcat/lib

# 2. 下载Redis Session Manager
wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/4.0/tomcat-cluster-redis-session-manager-4.0.jar

# 3. 验证下载
ls -lh tomcat-cluster-redis-session-manager-4.0.jar
# 应显示: -rw-r--r-- 1 user user 250K ... tomcat-cluster-redis-session-manager-4.0.jar

# 4. 验证JAR包完整性
jar -tf tomcat-cluster-redis-session-manager-4.0.jar | head -10

3.2 配置context.xml

文件位置 : $CATALINA_HOME/conf/context.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <!-- 默认监听资源 -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    
    <!-- Redis Session Manager 配置 -->
    <Valve className="tomcat.request.session.redis.SessionHandlerValve" />
    <Manager className="tomcat.request.session.redis.SessionManager" />
</Context>

配置说明:

  • SessionHandlerValve: 处理Session请求拦截
  • SessionManager: 管理Session的存储和读取

3.3 创建Redis配置文件

文件位置 : $CATALINA_HOME/conf/redis-data-cache.properties

properties 复制代码
# Redis主机地址(支持多个,逗号分隔)
redis.hosts=127.0.0.1:6379

# Redis密码
redis.password=123456

# 集群模式(默认false)
redis.cluster.enabled=false

# 哨兵模式(默认false)
redis.sentinel.enabled=false
# redis.sentinel.master=mymaster

# Redis数据库索引(建议使用专用database)
redis.database=4

# 负载均衡粘性会话(默认false)
# 如果启用了,必须在负载均衡器配置sticky session
lb.sticky-session.enabled=false

# Session持久化策略(默认DEFAULT)
# 可选值: DEFAULT, SAVE_ON_CHANGE, ALWAYS_SAVE_AFTER_REQUEST
session.persistent.policies=DEFAULT

# SSO会话超时时间(毫秒,0=永不过期)
redis.sso.timeout=0

四、配置参数详解

4.1 Redis连接参数

参数 默认值 说明
redis.hosts - Redis主机地址,多个用逗号分隔
redis.password - Redis密码
redis.database 0 Redis数据库索引(0-15)
redis.timeout 2000ms Redis连接超时时间

4.2 集群模式配置

单机模式(默认)
properties 复制代码
redis.hosts=127.0.0.1:6379
redis.cluster.enabled=false
redis.sentinel.enabled=false
Redis Cluster集群模式(仅参考)
properties 复制代码
redis.hosts=192.168.1.1:6379,192.168.1.2:6379,192.168.1.3:6379
redis.cluster.enabled=true
redis.sentinel.enabled=false
Redis Sentinel哨兵模式(仅参考)
properties 复制代码
redis.hosts=192.168.1.1:26379,192.168.1.2:26379,192.168.1.3:26379
redis.cluster.enabled=false
redis.sentinel.enabled=true
redis.sentinel.master=mymaster

4.3 Session持久化策略

策略 说明 性能影响
DEFAULT 请求结束时保存Session
SAVE_ON_CHANGE 每次setAttribute/removeAttribute都保存
ALWAYS_SAVE_AFTER_REQUEST 每次请求后强制保存

推荐 : 使用 DEFAULT 策略,性能最优。


4.4 粘性会话配置

不启用粘性会话(推荐)
properties 复制代码
lb.sticky-session.enabled=false
  • Session在所有Tomcat实例间共享
  • 负载均衡器无需特殊配置
启用粘性会话
properties 复制代码
lb.sticky-session.enabled=true
  • 需要在负载均衡器配置sticky session
  • Session值存储在本地JVM和Redis
  • Redis故障时使用本地Session降级

五、多环境配置示例

5.1 开发环境配置

properties 复制代码
# 单机Redis
redis.hosts=127.0.0.1:6379
redis.password=
redis.database=0

redis.cluster.enabled=false
redis.sentinel.enabled=false
lb.sticky-session.enabled=false
session.persistent.policies=DEFAULT

5.2 测试环境配置

properties 复制代码
# 单机Redis,使用专用database
redis.hosts=192.168.1.100:6379
redis.password=123456
redis.database=1

redis.cluster.enabled=false
redis.sentinel.enabled=false
lb.sticky-session.enabled=false
session.persistent.policies=DEFAULT

5.3 生产环境配置(仅参考)

properties 复制代码
# Redis Cluster集群
redis.hosts=192.168.1.1:6379,192.168.1.2:6379,192.168.1.3:6379
redis.password=123456
redis.database=4

redis.cluster.enabled=true
redis.sentinel.enabled=false
lb.sticky-session.enabled=false
session.persistent.policies=DEFAULT
redis.sso.timeout=0

5.4 高可用生产环境配置(仅参考)

properties 复制代码
# Redis Sentinel哨兵集群
redis.hosts=192.168.1.1:26379,192.168.1.2:26379,192.168.1.3:26379
redis.password=123456
redis.database=4

redis.cluster.enabled=false
redis.sentinel.enabled=true
redis.sentinel.master=mymaster
lb.sticky-session.enabled=false
session.persistent.policies=DEFAULT
redis.sso.timeout=0

六、配置验证

6.1 启动验证

成功日志:

复制代码
INFO: Loaded Apache Tomcat Native library [1.3.x]
INFO: Redis Session Manager initialized successfully
INFO: Server startup in [xxxx] milliseconds

失败日志:

复制代码
SEVERE: Unable to load Redis Session Manager
SEVERE: Could not connect to Redis at 127.0.0.1:6379

6.2 功能验证

步骤1: 检查Redis连接
bash 复制代码
redis-cli -h 127.0.0.1 -p 6379 -a 123456 ping
# 应返回: PONG
步骤2: 检查Session存储
bash 复制代码
# 访问应用,触发Session创建
curl http://localhost:8080/your-app/

# 查看Redis中的Session
redis-cli -h 127.0.0.1 -p 6379 -a 123456
SELECT 4
KEYS *

# 应显示类似: session:xxx-xxx-xxx-xxx
步骤3: 验证Session共享
bash 复制代码
# 部署两台Tomcat实例
# Tomcat1: http://192.168.1.10:8080/app/
# Tomcat2: http://192.168.1.11:8080/app/

# 在Tomcat1创建Session,在Tomcat2验证Session是否存在
redis-cli -h 127.0.0.1 -p 6379 -a 123456
SELECT 4
GET session:xxx

七、常见问题排查

7.1 JAR包找不到

错误日志:

复制代码
java.lang.ClassNotFoundException: tomcat.request.session.redis.SessionManager

解决方案:

bash 复制代码
# 检查jar包是否存在
ls -l $CATALINA_HOME/lib/tomcat-cluster-redis-session-manager-*.jar

# 如果不存在,重新下载
wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/4.0/tomcat-cluster-redis-session-manager-4.0.jar
cp tomcat-cluster-redis-session-manager-4.0.jar $CATALINA_HOME/lib/

7.2 JAR包版本不匹配

错误日志:

复制代码
java.lang.NoSuchMethodError: org.apache.catalina.session.ManagerBase.xxx

原因: Redis Session Manager版本与Tomcat版本不兼容

解决方案:

bash 复制代码
# 检查Tomcat版本
./bin/catalina.sh version

# 根据Tomcat版本下载对应Redis Session Manager
# Tomcat 9.0.x → 使用 4.0版本

7.3 Redis连接失败

错误日志:

复制代码
Could not connect to Redis at 127.0.0.1:6379

排查步骤:

bash 复制代码
# 1. 检查Redis服务是否启动
systemctl status redis
# 或
ps aux | grep redis

# 2. 检查Redis端口是否监听
netstat -tlnp | grep 6379

# 3. 检查防火墙
firewall-cmd --list-ports

# 4. 测试连接
redis-cli -h 127.0.0.1 -p 6379 ping

7.4 Session序列化失败

错误日志:

复制代码
java.io.NotSerializableException: com.xxx.XXXClass

解决方案:

java 复制代码
// 确保Session中的对象实现了Serializable接口
public class UserSession implements Serializable {
    private static final long serialVersionUID = 1L;
    // ...
}

7.5 Redis数据库冲突

问题描述: 多个应用使用同一个Redis数据库,Session数据冲突

解决方案:

properties 复制代码
# 为不同应用分配不同的database
# 应用1: database=4
redis.database=4

# 应用2: database=5
redis.database=5

八、性能优化建议

8.1 连接池优化

Redis Session Manager默认使用连接池,无需额外配置。

建议:

  • 单机Redis: 默认配置即可
  • 集群Redis: 适当增加连接池大小

8.2 Session超时配置

web.xml配置:

xml 复制代码
<session-config>
    <session-timeout>30</session-timeout> <!-- 30分钟 -->
</session-config>

注意: Session超时由Tomcat管理,Redis中Session会自动过期删除。


8.3 Redis内存优化

查看Redis内存使用:

bash 复制代码
redis-cli -h 127.0.0.1 -p 6379 -a 123456
INFO memory

优化建议:

  • 设置Redis最大内存: maxmemory 2gb
  • 设置淘汰策略: maxmemory-policy allkeys-lru

九、应用级依赖配置

9.1 pom.xml配置

如果应用代码中也需要使用Redis(业务缓存),需要在项目的 pom.xml 中添加:

xml 复制代码
<!-- Redis客户端 -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.10.0</version>
</dependency>

<!-- 连接池(Jedis 3.x需要) -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>

注意:

  • Tomcat Session Manager 和应用业务可以共用同一个Redis服务
  • Session Manager使用 database=4,业务数据建议使用 database=1,避免冲突

十、配置检查清单

10.1 安装前检查

  • Tomcat版本 >= 8.5
  • JDK版本 >= 1.8
  • Redis服务可用
  • 网络连通性正常

10.2 配置检查

  • jar包已复制到 $CATALINA_HOME/lib/
  • context.xml 已配置SessionManager和SessionHandlerValve
  • redis-data-cache.properties 文件存在
  • Redis主机地址正确
  • Redis密码正确
  • Redis数据库索引正确

10.3 启动验证

  • Tomcat启动成功
  • 日志无ERROR
  • 应用可访问
  • Session可创建
  • Redis中存在Session数据

十一、参考资源

资源 链接
Redis Session Manager 4.0下载 https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/4.0/tomcat-cluster-redis-session-manager-4.0.jar
Redis Session Manager GitHub https://github.com/ran-jit/tomcat-cluster-redis-session-manager
Tomcat 9 文档 https://tomcat.apache.org/tomcat-9.0-doc/
Redis 官方文档 https://redis.io/documentation
Redis Cluster教程 https://redis.io/topics/cluster-tutorial
Redis Sentinel文档 https://redis.io/topics/sentinel
Jedis GitHub https://github.com/redis/jedis
Commons Pool2 https://commons.apache.org/proper/commons-pool/
相关推荐
tmlx3I0812 小时前
Tomcat的架构设计和启动过程详解
java·tomcat
六bring个六2 小时前
文件互传在传输层的操作分析
分布式·p2p·c/c++·open harmony
宠友信息2 小时前
Spring Boot与异步审核构建仿小红书源码内容发布全流程
java·数据库·spring boot·redis·mysql·oracle·uni-app
Listen·Rain2 小时前
Springboot整合RedisStack
java·spring boot·redis
诚信定制8393 小时前
如何启动 Redis 服务:详细步骤指南
数据库·redis·缓存
栈溢出了3 小时前
Redis repl_backlog 学习笔记
java·开发语言·redis·学习
吴声子夜歌4 小时前
Redis 5.x——分布式锁
redis·分布式
殘殤血4 小时前
Tomcat的事件监听机制:观察者模式 _
java·观察者模式·tomcat
殘殤血5 小时前
Tomcat的事件监听机制:观察者模式
java·观察者模式·tomcat