【发布时间】:2021-04-01 04:27:05
【问题描述】:
我编写了一个简单的服务,使用 redis 将数据存储在内存中或从磁盘中获取数据,然后存储在内存中,并希望为慢速请求设置超时。我希望找到一种方法来发出一个超时的获取请求,以防止这个请求挂起。任何帮助表示赞赏。
【问题讨论】:
我编写了一个简单的服务,使用 redis 将数据存储在内存中或从磁盘中获取数据,然后存储在内存中,并希望为慢速请求设置超时。我希望找到一种方法来发出一个超时的获取请求,以防止这个请求挂起。任何帮助表示赞赏。
【问题讨论】:
所以,您可以在这里做一些事情。但是,首先我想知道您是否正在尝试过早优化。在大多数正常情况下,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 函数。
【讨论】:
防止这个请求挂起
如果将enable_offline_queue 设置为false,所有Redis 命令都会立即抛出异常,而不是等待重新连接。然后,您可以捕获该异常并从磁盘或某些数据库中获取。
在文档中找不到与此相关的任何内容,并在 SO 上发现了许多此类问题,因此在此旧问题中发布。
请记住,当enable_offline_queue 设置为 false 时,您在与服务器存在连接问题时发出的命令将永远不会被执行。
【讨论】: