【问题标题】:Redis client Lettuce command timeout versus socket timeoutRedis 客户端 Lettuce 命令超时与套接字超时
【发布时间】:2018-08-14 07:53:16
【问题描述】:

我们已经定义了 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);
}

Lettuce 文档定义默认值:

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

如果 Redis 服务关闭,应用程序必须在 300 毫秒内收到超时。哪个值必须定义为最大值?

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

【问题讨论】:

    标签: redis timeout spring-data-redis lettuce


    【解决方案1】:

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

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

    命令超时完全不同。建立连接后,客户端可以向服务器发送命令。它期望服务器响应这些命令。超时配置客户端等待服务器响应命令的时间。

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

    【讨论】:

    • 不客气。如果不是太麻烦,请将我的答案标记为正确。
    • 我在5月8日标记为正确答案,感谢您的支持
    • 对各种超时行为的描述是正确的,请对上面建议的超时持保留态度,对于任何现实世界的 Redis 使用场景来说,它们几乎肯定太高了(人们会期望正常Redis 命令在几毫秒内完成,等待几分钟而不是重试几乎肯定会导致生产事件。
    • @CRISTIANROMEROMATESANZ 你可能投了赞成票,但你没有勾选接受答案
    • 对不起玛丽。我忘记检查您的回复是否接受。再次感谢您帮助解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2013-11-30
    • 2017-07-02
    相关资源
    最近更新 更多