引起:io.lettuce.core.RedisCommandExecutionException:MOVED 8731 172.19.122.164:6379

问题描述

我们有一个 spring-boot 应用程序,它被部署到 AWS 中 EC2 实例中包含的 tomcat。 在本地我有 redis 设置。在我的 application.yml 中,我的 redis 配置如下所示:

redis:
  enabled: true
  clusterNodes: localhost:6379
  properties:
    lockExpiryMillis: 3000
    lockRetryAttempts: 3
    lockRetryWaitMillis: 50

我们在java中配置它,如下所示:

       {
           RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(clusterNodes.get(0).split(":")[0]);
           return new LettuceConnectionFactory(config);
       }
       RedisClusterConfiguration config = new RedisClusterConfiguration(clusterNodes);

虽然我在 QA 中的集群负载均衡器 url 如下所示:

aq************amazonaws.com:6379 实际上隐藏了所有 redis 集群。

我在本地使用此配置进行了测试......也使用 QA url。

但不断得到异常

引起:io.lettuce.core.RedisCommandExecutionException: MOVED 8731 172.19.122.164:6379

注意:版本和属性都很好,因为它在本地工作没有任何异常

解决方法

所以这个问题实际上很愚蠢......当计数为1时我正在配置RedisStandaloneConfiguration......虽然在我的情况下我没有得到实际的redis URL,而是我只是得到本地平衡器单个redis网址。

在 QA 中,当我用实际的一次分隔符更新 redis url 时,它工作正常,意味着没有引起:io.lettuce.core.RedisCommandExecutionException。

因为我们应该使用负载均衡器 url 而不是实际的,所以我必须更新代码才能在独立模式下启动 redis,只有当它是本地主机时(因为当然没有配置集群),而在其他时间我是在 RedisClusterConfiguration 中启动它。

更改的代码部分:

 if(clusterNodes.contains("localhost"))
        {
            RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("localhost");
            return new LettuceConnectionFactory(config);
        }
        
        RedisClusterConfiguration config = new RedisClusterConfiguration(Arrays.asList(clusterNodes));