问题描述
我们有一个 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));