Redis 客户端 Lettuce 的命令超时和套接字超时有何区别?

9
我们已经定义了Lettuce客户端连接工厂,以便能够连接到Redis并定义自定义套接字和命令超时:
@Bean
LettuceConnectionFactory lettuceConnectionFactory() {

   final SocketOptions socketOptions = SocketOptions.builder().connectTimeout(socketTimeout).build();
   final ClientOptions clientOptions =
           ClientOptions.builder().socketOptions(socketOptions).build();

   LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
           .commandTimeout(redisCommandTimeout)
           .clientOptions(clientOptions).build();
   RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration(redisHost,
           redisPort);

   final LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(serverConfig,
           clientConfig);
   lettuceConnectionFactory.setValidateConnection(true);
   return new LettuceConnectionFactory(serverConfig, clientConfig);
}

enter image description here

Lettuce文档定义默认值:

  • 默认套接字超时时间为10秒
  • 默认命令超时时间为60秒

如果Redis服务停止,应用程序必须在300毫秒内收到超时。最大值应该定义为多少?

Github示例项目: https://github.com/cristianprofile/spring-data-redis-lettuce

1个回答

17

在套接字选项中,您可以指定连接超时时间。这是Redis客户端(Lettuce)尝试建立与Redis服务器的TCP/IP连接所允许的最长时间。这个值应该相对较小(例如,最多1分钟)。

如果客户端在1分钟内无法与服务器建立连接,我认为可以安全地说服务器不可用(服务器停机、地址/端口错误、网络安全如防火墙禁止连接等)。

命令超时是完全不同的。一旦连接建立,客户端可以向服务器发送命令,并且它期望服务器响应这些命令。超时配置了客户端将等待服务器响应命令的时间长度。

我认为在客户端命令向服务器发送大量数据并且需要时间传输和存储这么多数据时,可以将此超时设置为较长的时间(例如几分钟)。


1
不用客气。如果可以的话,请将我的答案标记为正确。 - mvmn
我在5月8日将其标记为正确答案。感谢您的支持。 - CRISTIAN ROMERO MATESANZ
11
各种超时行为的描述是正确的。请放心使用上面建议的超时时间,但要注意它们几乎肯定对于任何真实世界的 Redis 使用场景都太高了(人们预计正常的 Redis 命令只需要几毫秒就可以完成,等待几分钟而不是重试几乎肯定会导致生产事故)。 - Joshua Cohen
@CRISTIANROMEROMATESANZ,您可能已经点赞了,但是您没有勾选接受答案。 - marie
抱歉,Marie。我忘记将您的回复标记为接受的答案。再次感谢您帮助解决我的问题。 - CRISTIAN ROMERO MATESANZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接