“无法获得 Jedis 连接"将 SSL 与 Redis 和 Spring Data Redis 一起使用时 [英] "Cannot get Jedis connection" when using SSL with Redis and Spring Data Redis

查看:66
本文介绍了“无法获得 Jedis 连接"将 SSL 与 Redis 和 Spring Data Redis 一起使用时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用启用 SSL 的 Redis(来自 AWS 的 ElasticCache),并且难以使用 Spring Data Redis 连接到它.

I'm using SSL enabled Redis (ElasticCache from AWS), and having difficulty in connecting to it using Spring Data Redis.

(请注意,如果我将普通 Jedis 或 Jedis Pool 与 Spring 一起使用,则连接工作正常.

(Note that the connectivity works fine, if I use plain Jedis or Jedis Pool with 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;
    }

}

RedisTemplate 用法:

RedisTemplate usage:

    @Autowired
    private RedisTemplate<String, String> redistemplate;


    public void api2() {

        HashOperations<String, Object, Object> hashOperations = redistemplate.opsForHash();

        hashOperations.put("KEY", "1", "one"); 
    }

}

任何使用 RedisTemplate 的操作都会抛出以下异常:

Any operation using RedisTemplate throws below exception:

"嵌套异常是org.springframework.data.redis.RedisConnectionFailureException:不能获取 Jedis 连接;嵌套异常是redis.clients.jedis.exceptions.JedisConnectionException:无法获取池中的资源] 具有根本原因2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT]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] [OUT]在 java.net.SocketInputStream.read(SocketInputStream.java:141)~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT]在 java.net.SocketInputStream.read(SocketInputStream.java:127)~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT]在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][OUT] 在 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][OUT] 在 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]"

"nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool] with root cause 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] java.net.SocketException: Connection reset 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at java.net.SocketInputStream.read(SocketInputStream.java:210) ~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at java.net.SocketInputStream.read(SocketInputStream.java:127) ~[na:1.8.0_141] 2018-01-22T15:59:35.531+11:00 [APP/PROC/WEB/0] [OUT] at 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] [OUT] at 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] at 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] [OUT] at 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] [OUT] at 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] [OUT] at 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] [OUT] at 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] [OUT] at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:108) ~[jedis-2.9.0.jar!/:na]"

注意:

  1. 这不是 SSL 证书的问题,因为 AWS 的 SSL 证书已经存在于 JVM 信任存储中,请注意 JedisPool 正在使用 SSL.

  1. This is not an issue with SSL Certs as SSL certs for AWS are already present in the JVM Trust store and note that JedisPool is working with SSL.

我怀疑 JedisConnectionFactory 以某种方式忽略了而不是建立 SSL 连接.我尝试了 JedisConnectionFactory 的其他 arg 构造函数,例如将 useSSL 设置为 true 等,但没有运气.

I suspect that somehow the JedisConnectionFactory is ignoring and not making a SSL connection. I tried other arg constructors of JedisConnectionFactory like setting the useSSL to true, etc, without luck.

感谢任何帮助或指示.

推荐答案

你只提到了 AWS Elastic Redis,但没有说明是基于集群的 Redis 还是单节点的 Redis ?

You mentioned only AWS Elastic Redis, but you didn't specify whether it is Cluster based Redis or Single Node Redis ?

Spring Data Redis 2.2 将支持带有 SSL 的集群.https://jira.spring.io/browse/DATAREDIS-974

Spring Data Redis 2.2 will support for Cluster with SSL. https://jira.spring.io/browse/DATAREDIS-974

这篇关于“无法获得 Jedis 连接"将 SSL 与 Redis 和 Spring Data Redis 一起使用时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆