我正在使用启用SSL的Redis(来自AWS的ElasticCache),在使用Spring Data Redis连接时遇到了一些困难。
请注意,如果我使用纯Jedis或带有Spring的Jedis Pool,则连接正常工作。
以下是代码片段:
@Value("${vcap.services.myredis.credentials.host}")
private String redisHost;
@Value("${vcap.services.myredis.credentials.password}")
private String redisPassword;
@Value("${vcap.services.myredis.credentials.port}")
private String redisPort;
public RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
String hostUri = "rediss://:" + redisPassword + "@" + redisHost + redisPort;
JedisShardInfo info = new JedisShardInfo(hostUri);
JedisConnectionFactory conn = new JedisConnectionFactory(info);
conn.afterPropertiesSet();
template.setConnectionFactory(conn);
template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
return template;
}
}
RedisTemplate使用方法:
@Autowired
private RedisTemplate<String, String> redistemplate;
public void api2() {
HashOperations<String, Object, Object> hashOperations = redistemplate.opsForHash();
hashOperations.put("KEY", "1", "one");
}
}
任何使用RedisTemplate的操作都会抛出以下异常:
嵌套异常是org.springframework.data.redis.RedisConnectionFailureException:无法获取Jedis连接;嵌套异常是redis.clients.jedis.exceptions.JedisConnectionException:无法从池中获取资源],根本原因是java.net.SocketException:连接重置。在SocketInputStream.read(SocketInputStream.java:210)处读取,在SocketInputStream.read(SocketInputStream.java:141)处读取,在SocketInputStream.read(SocketInputStream.java:127)处读取,在redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196)处填充,以确保填充,redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40),redis.clients.jedis.Protocol.process(Protocol.java:151),redis.clients.jedis.Protocol.read(Protocol.java:215),redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340),redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239),redis.clients.jedis.BinaryJedis.auth(BinaryJedis.java:2139),redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:108)。
注意:
这不是SSL证书的问题,因为AWS的SSL证书已经存在于JVM信任库中,而且请注意JedisPool正在使用SSL。
我怀疑JedisConnectionFactory在忽略并且没有建立SSL连接。我尝试使用JedisConnectionFactory的其他arg构造函数,例如将useSSL设置为true等,但都没有成功。
希望能提供任何帮助或者指引。
redisHost + ":"+ redisPort
吧? - user7294900String hostUri = "rediss://:" + redisPassword + "@" + redisHost + ":" + redisPort;
- Raghuveer Bhandarkar