You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:31:23