我正在使用启用 SSL 的 Redis(来自 AWS 的 ElasticCache),并且在使用 Spring Data Redis 连接到它时遇到困难。
(请注意,如果我使用普通 Jedis 或 Jedis Pool 与 Spring,连接工作正常)。
以下是代码片段:
@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;
}
}
Redis模板用法:
@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:无法获取
池中的资源]及其根本原因
2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [输出]
java.net.SocketException:连接重置
2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] 在
java.net.SocketInputStream.read(SocketInputStream.java:210)
~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [输出]
在 java.net.SocketInputStream.read(SocketInputStream.java:141)
~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [输出]
在 java.net.SocketInputStream.read(SocketInputStream.java:127)
~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [输出]
在
redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196)
~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0]
[输出] 于
redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0]
[OUT] 在 redis.clients.jedis.Protocol.process(Protocol.java:151)
~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0]
[输出] 在 redis.clients.jedis.Protocol.read(Protocol.java:215)
~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0]
[输出] 于
redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0]
[输出] 于
redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239)
~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0]
[输出] 在 redis.clients.jedis.BinaryJedis.auth(BinaryJedis.java:2139)
~[jedis-2.9.0.jar!/:na] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0]
[输出] 于
redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:108)
~[jedis-2.9.0.jar!/:na]"
Note:
这不是 SSL 证书的问题,因为 AWS 的 SSL 证书已存在于 JVM 信任存储中,并且请注意 JedisPool 正在使用 SSL。
我怀疑 JedisConnectionFactory 以某种方式忽略并且没有建立 SSL 连接。我尝试了 JedisConnectionFactory 的其他参数构造函数,例如将 useSSL 设置为 true 等,但没有运气。
任何帮助或指示表示赞赏。
不使用JedisShardInfo
因为它会导致其携带的配置含糊不清。构造函数接受JedisShardInfo
在 Spring Data Redis 2.0 中已弃用。请改用基于属性的配置:
JedisConnectionFactory conn = new JedisConnectionFactory();
conn.setHostName(redisHost);
conn.setPort(redisPort);
conn.setUseSsl(true);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)