gpt4 book ai didi

node.js - 如果 redis 不可用,如何忽略它?

转载 作者:IT王子 更新时间:2023-10-29 06:11:39 25 4
gpt4 key购买 nike

我希望我的应用程序(现在可以说是一个简单的 Node 文件)即使在 redis 不可用的情况下也能正常工作。我无法以正确的方式做到这一点。这是我试过的。

var redis = require('redis');
var redisClient = null;

var getRedisClient = function(){
if(redisClient){
return redisClient;
}

try {
redisClient = redis.createClient({connect_timeout : 5000, max_attempts : 1});
redisClient.on("error", function(err) {
console.error("Error connecting to redis", err);
redisClient = null;
});
return redisClient;
} catch(ex){
console.log("error initialising redis client " + ex);
return null;
}
};

try {
var client = getRedisClient();
console.log("done!");
} catch (ex){
console.log("Exception");
}

但是,使用此代码,如果 redis 不可用,我的应用程序将退出(它不应该因为我没有给出 process.exit() 命令)。

我该如何解决这个问题?

最佳答案

开始时检查连接是否成功

使用 promise,您可以保证至少在最初,您能够在指定的时间段内无错误地连接到 redis:

const redis = require('redis');
const Promise = require('bluebird');

function getRedisClient(timeoutMs){
return new Promise((resolve, reject) => {
const redisClient = redis.createClient();
const timer = setTimeout(() => reject('timeout'), timeoutMs);
redisClient.on("ready", () => {
clearTimeout(timer);
resolve(redisClient);
});
redisClient.on("error", (err) => {
clearTimeout(timer);
reject(err);
});
});
};

const redisReadyTimeoutMs = 10000;

getRedisClient(redisReadyTimeoutMs)
.then(redisClient => {
// the client has connected to redis sucessfully
return doSomethingUseful();
}, error => {
console.log("Unable to connect to redis", error);
});

你需要适当的错误处理

非空的 redis 客户端保证使用它不会抛出错误。

  • 您可能会遇到基础设施问题,例如Redis 进程崩溃,内存不足或网络中断。

  • 代码中的错误可能会导致错误,例如Redis 命令的参数无效或缺失。

您应该理所当然地处理 Redis 客户端错误。

不要 null Redis 客户端出错

它不会给你太多,但它会强制你在每次尝试使用它时检查是否为 null。

redis 客户端还具有内置的重新连接和重试机制,如果您在第一个错误后将其null,您将错过这些机制。查看 redis 包文档,寻找 retry_strategy .

DOtry .. catch ... 包装你的 redis 客户端代码,或者在你的 promise 链中使用 .catch

使用retry_strategy

关于node.js - 如果 redis 不可用,如何忽略它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28891495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com