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

我如何使用绝地连接到用于Redis集群的AWS ElastiCache?

凌朗
2023-03-14

之前,我们使用的Redis是通过AWS ElastiCache禁用集群模式的。

我们使用Jedis的Java代码指向主要的单节点endpoint,用于读写。

我们现在启用了群集模式。

现在,我们已经将代码更改为指向新Redis群集的配置endpoint,但它现在在接收请求时会抛出错误,请参见以下内容:

Redis不可用。继续使用队列请求消息。org.springframework.data.redis.群集重定向异常:重定向:槽2356到[ip地址]: 6379。;嵌套异常是redis.clients.jedis.exceptions.JedisMovedDataExc0019: MOVED 2356[ip地址]: 6379

我们的配置代码如下:

    @Bean(name = "redisTemplate")
    public RedisTemplate<String, String> getRedisTemplate(JedisConnectionFactory jedisConnectionFactory) {
        RedisTemplate template = new RedisTemplate();
        template.setConnectionFactory(jedisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    JedisConnectionFactory jedisConnectionFactory(Configuration config) {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName(config.get(HOST));
        jedisConnectionFactory.setPort(config.getInt(PORT));
        jedisConnectionFactory.setUsePool(true);
        jedisConnectionFactory.setPoolConfig(createJedisPoolConfig(config));
        jedisConnectionFactory.afterPropertiesSet();
        return jedisConnectionFactory;
    }

    JedisPoolConfig createJedisPoolConfig(Config config) {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(config.getInt(MAX, 8));
        poolConfig.setMaxIdle(config.getInt(MAXIDLE, 8));
        poolConfig.setMinIdle(config.getInt(MINIDLE, 1));
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);
        return poolConfig;
    }

仅仅改变绝地武士以指向配置endpoint就足够了吗?

我需要更改代码中的任何内容吗?

共有1个答案

常光明
2023-03-14

仅仅改变绝地武士以指向配置endpoint就足够了吗?

不,因为Redis客户机——本例中的绝地武士——需要知道它正在连接到一个集群,而目前没有。

当Redis集群告诉客户端所请求的数据现在已经被“重定向”到另一个节点时,您会得到“移动”。然而,Jedis不知道正在使用集群,因此还有任何其他节点,因此甚至不能连接到它们来检索数据。

我需要更改代码中的任何内容吗?

要发现Redis节点,需要使用JedisCluster而不是JedisPool

请注意,您只需要引用配置endpoint:

Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();

jedisClusterNodes.add(new HostAndPort(CONFIGURATION_ENDPOINT, 6379));

try (JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes)) {
// ...
}
 类似资料:
  • 当我试图按照以下部署指南连接到主节点时,我面临着MasternotFounderRorr:https://docs.bitnami.com/tutorials/deploy-redis-sentinel-production-cluster/ 连接主Redis Sentinel节点的代码是: 我面对红魔。哨兵。MasternotFounderRorr:没有为“MyMaster”错误找到master

  • 问题内容: 我们知道不建议在Amazon实例外部访问ElastiCache,因此我们仅在Amazon EC2实例内部进行尝试。 我们有一个具有9个节点的ElastiCache Redis集群 。当我们尝试使用常规redis实现连接到它时,它会引发一些Moved错误 根据@Miller尝试了重试策略方法。还尝试过使用不稳定和稳定(可怜的人)实现的RedisCluster。 这些实现均无作用。有什么建

  • 我已经使用以下指南成功地设置了一个密码保护的redis群集: 我使用ruby和下面的连接字符串…我做错了吗? 我得到的错误是:

  • 我使用spring boot data redis连接到redis群集,使用版本2.1.3,配置如下: 但是,在操作过程中,始终会收到警告异常消息,如下所示: 这似乎是莴苣的问题,如何映射远程主机

  • 我目前正在做一个小项目,我需要将kafka集群连接到mongodb,以便将发布到kafka主题的消息存储在mongodb数据库中。我目前有一个本地kafka集群,一个sping引导生产者向一个主题发布消息,一个spinger引导消费者在本地使用这些消息。我也在本地安装了mongob指南针……我一直在看教程,我发现我必须使用某种接收器连接器(mongob连接器)来做我想做的事情,但大多数示例都是基于

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