如果没有连接,你如何杀死redis客户端?

时间:2012-05-03 02:59:22

标签: node.js redis

我有一个有效的服务器配置,其中无法访问redis,但服务器可以正常运行(我只是在无法找到redis时删除功能)。

但是,我无法很好地管理连接错误。我想知道连接错误何时失败并在这种情况下关闭客户端。

我发现连接重试永远不会停止。实际上吞下了quit() - “排队等待下一次服务器连接”。 - 被叫时

在没有建立连接的情况下,有没有办法杀死客户端?

var redis = require("redis"),
    client = redis.createClient();

client.on("error", function(err) {
    logme.error("Bonk. The worker framework cannot connect to redis, which might be ok on a dev server!");
    logme.error("Resque error : "+err);
    client.quit();
});

client.on("idle", function(err) {
    logme.error("Redis queue is idle. Shutting down...");
});

client.on("end", function(err) {
    logme.error("Redis is shutting down. This might be ok if you chose not to run it in your dev environment");
});

client.on("ready", function(err) {
    logme.info("Redis up! Now connecting the worker queue client...");
});
  • 错误 - Resque错误:错误:Redis连接到127.0.0.1:6379失败 - 连接ECONNREFUSED
  • 错误 - Redis正在关闭。如果您选择不在开发环境中运行它,这可能没问题
  • 错误 - Resque错误:错误:Redis连接到127.0.0.1:6379失败 - 连接ECONNREFUSED
  • 错误 - Resque错误:错误:Redis连接到127.0.0.1:6379失败 - 连接ECONNREFUSED
  • 错误 - Resque错误:错误:Redis连接到127.0.0.1:6379失败 - 连接ECONNREFUSED
  • 错误 - Resque错误:错误:Redis连接到127.0.0.1:6379失败 - 连接ECONNREFUSED

有趣的是,'end'事件被释放。为什么呢?

2 个答案:

答案 0 :(得分:1)

您可能希望仅使用client.end()强制结束与redis的连接,而不是使用等待所有未完成请求完成的client.quit(),然后发送QUIT命令如您所知,需要使用redis完成工作连接。

答案 1 :(得分:1)

控制客户端的重新连接行为的正确方法是使用 retry_strategy

断开连接后,redisClient将尝试按照默认行为重新连接。通过在创建客户端时提供retry_strategy可以覆盖默认行为。

文档中一些细粒度控件的用法示例。

var client = redis.createClient({
    retry_strategy: function (options) {
        if (options.error && options.error.code === 'ECONNREFUSED') {
            // End reconnecting on a specific error and flush all commands with
            // a individual error
            return new Error('The server refused the connection');
        }
        if (options.total_retry_time > 1000 * 60 * 60) {
            // End reconnecting after a specific timeout and flush all commands
            // with a individual error
            return new Error('Retry time exhausted');
        }
        if (options.attempt > 10) {
            // End reconnecting with built in error
            return undefined;
        }
        // reconnect after
        return Math.min(options.attempt * 100, 3000);
    }
});

参考:https://www.npmjs.com/package/redis#options-object-properties

为了在连接断开时杀死客户端,我们可以使用以下retry_strategy。

var client = redis.createClient({
    retry_strategy: function (options) {
        return undefined;
    }
});