JedisPooled无法读取AWS Elastic Redis Cluster数据(EC2运行失败)
AWS ElastiCache Redis集群连接超时排查与解决
问题背景
本地通过隧道连接AWS ElastiCache Redis集群时代码正常运行,但部署到EC2实例后出现读取超时错误。
连接Redis的代码实现
Redis连接类
public class RedisConnection { private JedisPooled jedisPooled; public RedisConnection(final RedisConfiguration configuration) { this.jedisPooled = new JedisPooled(new GenericObjectPoolConfig<>(), configuration.redisHostname(), configuration.redisPort(), 2000, configuration.redisPassword()); } public JedisPooled getJedisPooled() { return this.jedisPooled; } }
Redis缓存读取服务类
public class RedisCacheService implements CacheService { private static final Logger LOG = LoggerFactory.getLogger(RedisCacheService.class); private final RedisConnection redisConnection; public RedisCacheService(final RedisConnection redisConnection) { this.redisConnection = redisConnection; } @Override public String getValue(final String key) { LOG.debug("start to find cache with {}" , key); final Optional<String> result = Optional.ofNullable(redisConnection.getJedisPooled().get(key)); return result.orElse(null); } }
运行时错误日志
2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.util.RedisInputStream.ensureFill(RedisInputStream.java:208) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.util.RedisInputStream.readByte(RedisInputStream.java:46) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.Protocol.process(Protocol.java:126) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.Protocol.read(Protocol.java:192) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:316) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:243) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.Connection.auth(Connection.java:372) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:345) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.Connection.<init>(Connection.java:53) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.ConnectionFactory.makeObject(ConnectionFactory.java:71) 2022-09-16T13:13:19.883+02:00 at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:571) 2022-09-16T13:13:19.883+02:00 at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:298) 2022-09-16T13:13:19.883+02:00 at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:223) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.util.Pool.getResource(Pool.java:34) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:28) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:7) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.providers.PooledConnectionProvider.getConnection(PooledConnectionProvider.java:54) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:23) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:148) 2022-09-16T13:13:19.883+02:00 at redis.clients.jedis.UnifiedJedis.get(UnifiedJedis.java:570) 2022-09-16T13:13:19.883+02:00 at com.govipul.learning.redis.impl.RedisCacheService.getValue(RedisCacheService.java:36)
排查与解决步骤
- 检查VPC与子网配置:确认EC2实例和Redis集群处于同一个VPC内;若不在同一VPC,需配置VPC peering,或开启Redis公网访问(不推荐生产环境)。同时确保Redis子网组包含EC2所在子网,且子网间路由规则允许通信。
- 验证安全组规则:Redis集群安全组需添加入站规则,允许EC2实例所在安全组的流量访问Redis端口(默认6379);EC2实例安全组需添加出站规则,允许访问Redis集群的端口和IP段。
- 确认Redis访问权限:检查Redis集群的密码配置,确保代码中传入的
redisPassword完全匹配;若启用IAM认证,需调整代码使用IAM角色认证,而非简单密码方式。 - 调整连接超时与池配置:当前2000ms超时可能不足,可增大至5000ms;同时优化连接池参数,避免连接耗尽:
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig<>(); poolConfig.setMaxTotal(20); poolConfig.setMaxIdle(10); poolConfig.setMinIdle(5); poolConfig.setTestOnBorrow(true); this.jedisPooled = new JedisPooled(poolConfig, configuration.redisHostname(), configuration.redisPort(), 5000, configuration.redisPassword()); - 测试网络连通性:在EC2实例上执行
telnet <redis-hostname> <redis-port>测试端口可达性,或redis-cli -h <redis-hostname> -p <redis-port> -a <password> ping测试Redis命令,定位网络层面问题。 - 检查Redis集群状态:登录AWS控制台确认Redis集群状态为
available,节点无故障或维护情况。
内容的提问来源于stack exchange,提问作者Vipul Goswami
相关产品推荐
相关产品推荐

