Redisson连接AWS ElastiCache Redis遇超时及驱逐异常求助
环境配置:
- AWS ElastiCache Redis 7.0.7
- Redisson Java客户端 3.16.0
- Java 1.8
- 已实现Redis操作异常时降级到下游服务/数据库的机制,当前降级逻辑正常运行
Redisson客户端配置代码:
redissonConfig.setNettyThreads(128); redissonConfig.useClusterServers() .setKeepAlive(true) .setConnectTimeout(5000) .setRetryAttempts(0) .setRetryInterval(0) .setPingConnectionInterval(10000) .setDnsMonitoringInterval(20000) .addNodeAddress(redisAddress); RedissonClient client = Redisson.create(redissonConfig); return client;
遇到的间歇性异常:
- 读写操作异常:
exception: org.redisson.client.RedisTimeoutException: Command still hasn't been written into connection! Try to increase nettyThreads setting. Payload size in bytes: 52. Node source: NodeSource [slot=8995, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@573846890 [redisClient=[addr=rediss://xxxxx:6379], channel=[id: 0x93e5c3e6, L:/:38098 - R:xxx], currentCommand=null], command: (EVAL), params: [local value = redis.call('hget', KEYS[1], ARGV[2]); if value == false then return nil; end; local t,..., 5, data, redisson__timeout__set:{data}, redisson__idle__set:{data}, redisson__map_cache__last_access__set:{data}, {data}:redisson_options, 1684331276823, PooledUnsafeDirectByteBuf(ridx: 0, widx: 52, cap: 256)] after 0 retry attempts
- Redisson自动驱逐缓存时的异常(临时通过redis-cli手动驱逐解决):
exception: org.redisson.client.RedisException: ERR user_script:1: bad argument #2 to 'unpack' (data string too short) script: 401d7fca9b4e9022dffaa4fd236958c2babbc2f3, on @user_script:1.. channel: [id: 0x064bccc5
针对读写操作的RedisTimeoutException
- 优化Netty线程与连接池配置:当前
nettyThreads=128,可结合连接池参数补充配置,在useClusterServers()后添加setMasterConnectionPoolSize(64)和setSlaveConnectionPoolSize(128),避免连接耗尽导致命令无法写入。若业务并发量较高,可逐步将nettyThreads提升至256(不超过CPU核心数2倍,避免线程上下文切换开销)。 - 启用重试机制:当前
retryAttempts=0,网络抖动会直接触发异常。建议将retryAttempts设为2-3,retryInterval设为100-200ms,给网络恢复留缓冲时间,减少间歇性异常触发降级的频率。 - 调整Ping连接间隔:将
PingConnectionInterval从10000ms缩短至5000ms,及时检测无效连接并重建,避免使用已断开的连接发送命令。 - 排查AWS网络环境:确认ElastiCache集群与应用服务器在同一VPC下,检查安全组双向通信权限,排查是否存在网络带宽瓶颈或TCP keepalive参数配置问题。
针对自动驱逐的RedisException(unpack参数错误)
- 升级Redisson版本:Redisson 3.16.0属于旧版本,该
unpack参数问题在3.18.x及以上版本已修复。建议升级到兼容Java 1.8的最新稳定版本(最高3.23.x,3.24+不再支持Java 8),新版本对Lua脚本的处理更严谨,可避免缓存元数据损坏导致的驱逐异常。 - 清理损坏的缓存元数据:手动执行Redis命令清理异常键对应的元数据集合,比如
redisson__timeout__set:{data}、redisson__idle__set:{data}等,避免Redisson执行驱逐脚本时读取到不完整数据。 - 启用缓存元数据校验:在Redisson配置中添加
setCheckLockSyncedSlaves(true)(集群模式适用),确保主从节点缓存元数据同步一致,减少数据不一致引发的脚本执行错误。 - 调整驱逐策略配置:若使用MapCache,检查
timeToLive和maxIdleTime配置是否合理,避免短时间内大量键同时过期导致脚本执行压力过大。可设置setEvictionPolicy(EvictionPolicy.LRU)并调整maxSize,让驱逐过程更平缓。
内容的提问来源于stack exchange,提问作者Osama Jetawe

