使用Redisson实现Tomcat Session Redis存储时的连接异常及Redis服务停止问题求助
解决Redisson存储Tomcat Session时Redis连接异常及崩溃问题
从你提供的错误信息(WriteRedisConnectionException、Connection reset by peer、StacklessClosedChannelException)和配置来看,问题核心是Redis连接异常,甚至引发了Redis服务器崩溃。下面是具体的排查和解决方向:
1. 检查版本兼容性问题
你使用的spring-data-redis-1.6.2.RELEASE和jedis-2.5.1都是比较老旧的版本,若Redisson版本过高,很容易和这些组件、Redis服务器版本产生兼容冲突:
- 确认Redisson版本与Redis服务器匹配:比如Redis 6.x+需要Redisson 3.12及以上版本,Redis 7.x需要Redisson 3.16+
- 尝试降低Redisson版本到与Spring Data Redis兼容的范围,比如Spring Data Redis 1.6.x搭配Redisson 3.8.x左右的稳定版本
2. 排查Redis崩溃的根本原因
Redis突然停止运行,一定要查看它的日志文件(通常路径是/var/log/redis/redis-server.log或Redis安装目录下的redis.log),日志会明确记录崩溃原因:
- 内存溢出(OOM):如果日志里有
OOM command not allowed when used memory > maxmemory,需要调整Redis的maxmemory和maxmemory-policy配置,比如增大内存限制,或者把maxmemory-policy设置为allkeys-lru - 命令执行异常:如果是Redisson发送的某个命令导致Redis崩溃,大概率是Redis版本bug,建议升级Redis到最新稳定版
3. 优化Redisson连接配置
你的redisson.conf里部分连接参数可能不合理,容易导致连接超时或断开:
- 调大超时时间:把
timeout从3000改为5000或10000,connectTimeout和idleConnectionTimeout也同步调整到10000以上 - 调整连接池大小:如果Tomcat并发量较高,
connectionPoolSize=64可能不够,可以增大到128;同时connectionMinimumIdleSize不要设置过大,避免占用过多Redis连接资源 - 确认Redis绑定地址:检查Redis配置文件的
bind项,如果设置了特定IP,要和redisson.conf里的address匹配,或者直接设为bind 0.0.0.0允许所有IP连接(生产环境注意配合密码认证)
4. 检查Session数据的序列化兼容性
你使用的SerializationCodec是JDK默认序列化,如果Session中存储的对象没有实现Serializable接口,会导致序列化失败,进而引发Redis处理异常:
- 确认所有放入Session的对象(包括自定义对象)都实现了
java.io.Serializable接口 - 也可以尝试更换序列化方式,比如用
JsonJacksonCodec避免JDK序列化的兼容性问题,修改redisson.conf的codec配置:
codec: !<org.redisson.codec.JsonJacksonCodec> {}
5. 解决Spring Data Redis与Redisson的连接冲突
你同时用Spring Data Redis(Jedis)和Redisson操作同一个Redis数据库(database 0),可能导致连接池资源抢占或命令冲突:
- 给两者分配不同的Redis数据库:比如把Redisson的
database改为1,Spring Data Redis保持0,避免相互干扰 - 检查两者的连接池配置,确保总连接数不超过Redis的
maxclients设置(默认是10000)
6. 验证Redis基础可用性
先手动测试Redis连接是否正常,排除基础问题:
- 用
redis-cli连接Redis:redis-cli -h 127.0.0.1 -p 6379,执行PING命令看是否返回PONG - 模拟Redisson的操作,手动执行HMGET命令:
HMGET redisson:tomcat_session:34AE84972BC40CFB6C9C1B58CCDF37FE attr1 attr2(替换为实际的Session属性键),查看是否能正常返回结果
内容的提问来源于stack exchange,提问作者Bala




