首页 > 解决方案 > 引起: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

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

标签: javaspring-bootredisspring-data-redis

解决方案


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

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

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

更改的代码部分:

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

推荐阅读