当前位置: 首页 > 知识库问答 >
问题:

"无法获得Jedis连接"当使用SSL与Redis和Spring Data Redis

严扬
2023-03-14

我使用的是支持SSL的Redis(来自AWS的ElasticCache),使用Spring Data Redis很难连接到它。

(请注意,如果我使用普通的绝地武士或带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;
    }

}

RedisTem板的用法:

    @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连接;嵌套html" target="_blank">异常为redis.clients.Jedis.exceptions.JedisConnectionException:无法从池中获取资源]根本原因2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]JAVA网SocketException:连接重置2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]在java上。网SocketInputStream。阅读(SocketInputStream.java:210)~[na:1.8.0_141]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]在java上。网SocketInputStream。阅读(SocketInputStream.java:141)~[na:1.8.0_141]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]在java上。网SocketInputStream。在redis上阅读(SocketInputStream.java:127)~[na:1.8.0_141]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]。客户。util。重新输入流。在redis上下载[jedis-2.9.0.jar!/:na]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]。客户。util。重新输入流。redis的readByte(redInputStream.java:40)~[jedis-2.9.0.jar!/:na]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]。客户。绝地武士。协议进程(Protocol.java:151)~[jedis-2.9.0.jar!/:na]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]在redis。客户。绝地武士。协议在redis上阅读(Protocol.java:215)~[jedis-2.9.0.jar!/:na]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]。客户。绝地武士。联系ReadProtocolWithCheckingBreaked(Connection.java:340)~[jedis-2.9.0.jar!/:na]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]在redis上。客户。绝地武士。联系getStatusCodeReply(Connection.java:239)~[jedis-2.9.0.jar!/:na]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]在redis上。客户。绝地武士。双星绝地武士。auth(BinaryJedis.java:2139)~[jedis-2.9.0.jar!/:na]2018-01-22T15:59:35.5311:00[APP/PROC/WEB/0][OUT]在redis上。客户。绝地武士。绝地工厂。makeObject(JedisFactory.java:108)~[jedis-2.9.0.jar!/:na]”

注:

>

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

    我怀疑JedisConnectionFactory不知何故忽略了SSL连接,没有建立SSL连接。我尝试了JedisConnectionFactory的其他arg构造函数,比如将useSSL设置为true等,但运气不佳。

    感谢您的帮助或指点。

  • 共有3个答案

    空鸿云
    2023-03-14

    您只提到了AWS弹性Redis,但没有指定它是基于集群的Redis还是单节点Redis?

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

    陆宇航
    2023-03-14

    然而,我遇到了一个类似的问题,它与JedisPool有关,而不是与SpringJedisShardInfo有关。不过,我相信这基本上是同一个问题。当连接到启用SSL的AWS Elasticache redis集群时,我会得到一个

    redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset
    

    解决我问题的方法是使用jedis 2.9.0并启动我的JedisPool

    String host = "someHost"; // The primary endpoint of the cluster
    JedisPool jedisPool = new JedisPool("rediss://" + host + ":6379");
    

    这里使用字符串构造函数很重要,因为URI构造函数不能启用SSL。

    吕天逸
    2023-03-14

    不要使用JedisShardInfo,因为这会导致其携带的配置不明确。在Spring Data Redis 2.0中,接受JedisShardInfo的构造函数已被弃用。请改用基于属性的配置:

    JedisConnectionFactory conn =  new JedisConnectionFactory();
    conn.setHostName(redisHost);
    conn.setPort(redisPort);
    conn.setUseSsl(true);
    
     类似资料:
    • 我正试图用JedisSentinelPool连接到redis sentinel 这给了我以下错误: 原因:redis.clients.jedis.exceptions.jedisconnectionexception:所有哨兵都关闭了,无法确定mymaster在哪里master正在运行... 但是,我能看到我的哨兵在跑。因此,参考这篇文章:https://github.com/luin/iored

    • 由于单个redis实例不符合我的要求,我选择了redis cluster。我用三个节点组成集群,并将数据填充到集群中。当我使用JedisCluster从集群获取数据时,它比单个实例花费更多的时间。那么,将绝地与redis星系团连接起来的正确方式是什么呢。我如何利用连接池将绝地与redis集群连接起来?

    • 问题内容: 我已经在几个线程中看到了答案,但对我却没有解决,而且由于我的问题偶尔发生,因此问这个问题是否有人有任何想法。 我正在使用jedis版本2.8.0,Spring Data Redis版本1.7.5。和redis服务器版本2.8.4用于我们的缓存应用程序。 我有多个缓存保存在redis中,并且从redis获得请求。我正在使用spring数据redis API保存和获取数据。 所有保存和获取

    • 使用SSL连接到Postgres时引发异常。 原因:javax.net.ssl.SSLException:收到致命警报:在sun . security . SSL . alerts . getsslexception(alerts . Java:208)在sun . security . SSL . alerts . getsslexception(alerts . Java:154)在sun .

    • 问题内容: 我正在尝试使用Jedis使用Spring数据Redis将消息发布到频道。这是一个非常简单的Java配置: 其中。 当我运行以下测试时: 我得到以下堆栈跟踪: 问题答案: 此问题是由与弹簧数据Redis(1.5.0.RELEASE)不兼容的Jedis版本(2.7.2)引起的。我花了3天的时间面对同样的问题,然后才能从这篇文章和评论中得到启发。Jedis版本(2.6.2)可以正常工作(尽管

    • 我每5分钟运行一次批处理作业,我不希望其他节点运行同一个作业,因此我使用绝地锁将一个对象锁定5分钟。这样,如果另一个节点试图运行同一个作业,它们就不会得到锁。工作是在获得锁后开始的,当我试图从Redis读取它时,我得到以下异常情况: 这是我的密码 spring启动应用程序。属性文件 作业在开始时执行以下代码以获得锁 之后,redis仓库类试图读取特定模式的值... 这就是我在日志中看到的完全例外。