通过Dataflow连接MemoryStore时出现JedisConnectionException异常求助
异常原因排查与解决方法
核心原因分析
JedisConnectionException: Unknown reply 通常由以下几种情况导致:
- 未启用SSL连接:Google Cloud MemoryStore Redis默认强制要求SSL加密连接,你的代码使用普通非SSL连接,导致协议解析失败,无法识别Redis返回的响应。
- 网络配置不匹配:Dataflow Worker所在网络无法访问MemoryStore实例(比如不在同一个VPC,或未配置VPC peering/Shared VPC),部分数据包传输异常也会引发响应解析错误。
- 连接资源管理不当:每次
processElement都新建Jedis连接,未复用连接池,可能导致连接不稳定或资源耗尽。 - 认证信息缺失:如果MemoryStore实例设置了访问密码,代码未提供认证信息也会导致连接异常。
针对性解决方法
1. 启用SSL连接
修改Jedis初始化代码,使用SSL连接方式:
// 替换原有的Jedis初始化代码 Jedis jedis = new Jedis("12.08.64.4", 6378, true); // 第三个参数true启用SSL // 若实例设置了密码,添加认证步骤 jedis.auth("your-memorystore-password");
更推荐使用JedisPool管理连接池,避免重复创建连接(在DoFn中通过注解初始化池资源):
class redisconn1 extends DoFn<String,String> { private static final long serialVersionUID = 1L; private static final Logger LOG = LoggerFactory.getLogger(redisconn1.class); private JedisPool jedisPool; @Setup public void setup() { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(10); poolConfig.setMaxIdle(5); // 启用SSL的连接池配置 jedisPool = new JedisPool(poolConfig, "12.08.64.4", 6378, Protocol.DEFAULT_TIMEOUT, "your-memorystore-password", true); } @ProcessElement public void processElement(ProcessContext c) { try (Jedis jedis = jedisPool.getResource()) { LOG.info("Server is running: " + jedis.ping()); } catch (Exception e) { LOG.error("Redis connection error", e); } } @Teardown public void teardown() { if (jedisPool != null) { jedisPool.close(); } } }
2. 验证网络配置
确保Dataflow Worker与MemoryStore实例在同一个VPC网络中,在PipelineOptions中指定VPC和子网:
options.setNetwork("projects/heg-dev-rtstdo-0/global/networks/your-vpc-name"); options.setSubnetwork("projects/heg-dev-rtstdo-0/regions/us-east4/subnetworks/your-subnet-name");
MemoryStore默认允许同一VPC内的所有IP访问,无需额外防火墙规则。
3. 检查Jedis版本兼容性
确保Jedis版本与MemoryStore Redis版本兼容(MemoryStore支持Redis 4.0/5.0/6.0/7.0,推荐使用Jedis 3.x或4.x稳定版)。更新Maven依赖:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.4.3</version> <!-- 使用最新稳定版 --> </dependency>
4. 确认MemoryStore实例配置
- 核对实例的端口是否正确(MemoryStore Redis默认SSL端口为6379,若你配置了自定义端口需确保代码中一致)。
- 若实例设置了访问密码,必须在代码中添加
jedis.auth(password)认证步骤。
验证步骤
- 在同一VPC内的本地虚拟机测试Jedis SSL连接是否正常,排除代码本身问题。
- 部署Dataflow时指定正确的VPC配置,确保Worker能访问MemoryStore实例。
- 查看Dataflow Worker日志,确认是否还有连接异常,若有则进一步排查网络或认证问题。
内容的提问来源于stack exchange,提问作者Nagesh B Viswanadham
相关产品推荐
相关产品推荐

