【问题标题】:Nodejs set timeout for Redis requestsNodejs为Redis请求设置超时
【发布时间】:2021-04-01 04:27:05
【问题描述】:

我编写了一个简单的服务,使用 redis 将数据存储在内存中或从磁盘中获取数据,然后存储在内存中,并希望为慢速请求设置超时。我希望找到一种方法来发出一个超时的获取请求,以防止这个请求挂起。任何帮助表示赞赏。

【问题讨论】:

    标签: node.js redis


    【解决方案1】:

    所以,您可以在这里做一些事情。但是,首先我想知道您是否正在尝试过早优化。在大多数正常情况下,Redis 速度非常快,如果您在客户端上发现性能问题,则表明您的数据或您在 redis 中处理数据的方式存在问题。这应该在 redis 中解决,您不应该在客户端中执行任何操作来处理缓慢的请求。

    那么,如果您偶尔会看到减速,它们是从哪里来的?这不是一个正常的 redis 问题,应该解决而不是寻找 javascript 修复。

    如果您仍在寻找 javascript 修复程序,您可以执行以下操作:

    const client = require('redis').createClient(...);
    
    export async function asyncSetEx(key) {
      return new Promise((resolve, reject) => {
        const timer = setTimeout(() => {
          reject(new Error('Timed out'));
        });
        client.setEx(key, (res, err) => {
          if (err) {
            reject(err);
          } else {
            resolve(res);
          }
          clearTimeout(timer);
        });
      });
    }
    

    不过,我建议对其进行概括,以便它适用于具有任意数量参数的任何 redis 函数。

    【讨论】:

      【解决方案2】:

      防止这个请求挂起

      如果将enable_offline_queue 设置为false,所有Redis 命令都会立即抛出异常,而不是等待重新连接。然后,您可以捕获该异常并从磁盘或某些数据库中获取。

      在文档中找不到与此相关的任何内容,并在 SO 上发现了许多此类问题,因此在此旧问题中发布。

      请记住,当enable_offline_queue 设置为 false 时,您在与服务器存在连接问题时发出的命令将永远不会被执行。

      【讨论】:

        猜你喜欢
        • 2019-07-25
        • 2011-04-25
        • 2019-06-21
        • 2017-03-16
        • 2020-06-17
        • 2018-06-29
        • 2022-12-11
        • 1970-01-01
        • 2019-05-17
        相关资源
        最近更新 更多