Node.js:关闭时关闭所有Redis客户端

时间:2014-01-03 01:33:20

标签: javascript node.js redis node-redis

今天,我将Redis集成到我的node.js应用程序中,并将其用作会话存储。基本上,在成功验证后,我将相应的用户对象存储在Redis中。

当我在身份验证后收到http请求时,我尝试使用哈希从Redis中检索用户对象。如果检索成功,则表示用户已登录并且可以完成请求。

将用户对象存储在Redis中的行为和检索发生在两个不同的文件中,因此我在每个文件中都有一个Redis客户端。

问题1: 是否有两个Redis客户端,每个文件一个?或者我应该只实例化一个客户端并在应用程序的所有区域使用它?

问题2: node-redis库是否提供显示已连接客户端列表的方法?如果是这样,我将能够遍历列表,并在服务器关闭时为每个列表调用client.quit()。

顺便说一句,这就是我实现服务器“正常关闭”的方式:

//Gracefully shutdown and perform clean-up when kill signal is received
process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);

function cleanup() {
    server.stop(function() {
        //todo: quit all connected redis clients

        console.log('Server stopped.');

        //exit the process
        process.exit();
    });
};

3 个答案:

答案 0 :(得分:2)

可能要求使用多个连接,具体取决于应用程序如何使用Redis。

例如,一旦使用连接来收听发布/订阅频道,则只能用于此目的,而不能用于其他目的。根据{{​​3}}上的文档:

  

一旦客户端进入订阅状态,就不应该发出任何其他命令,除了其他SUBSCRIBEPSUBSCRIBEUNSUBSCRIBEPUNSUBSCRIBE命令之外。

因此,如果您的应用程序需要订阅频道,并且将Redis用作常规值缓存,则它至少需要两个客户端:一个用于订阅频道,一个用于将Redis用作缓存。

也有像SUBSCRIBE这样阻塞的Redis命令。繁忙的Web服务器通常一次答复多个请求。假设服务器为响应请求A,使用其Redis客户端发出阻止命令。然后请求B到来,服务器需要使用非阻塞命令来回答Redis,但是客户端仍在等待发出的阻塞命令以使请求A完成。现在,对请求B的响应被另一个请求延迟。可以通过将另一个客户端用于第二个请求来避免这种情况。

如果您不使用任何需要多个连接的设施,那么您可以并且应该仅使用一个连接。

如果使用Redis的方式需要多个连接,并且只需要一个连接列表但不需要复杂的连接管理,则可以创建自己的工厂函数:它将调用redis.createClient()并在返回之前保存客户端。然后在关闭时,您可以浏览已保存客户端的列表并关闭它们。不幸的是,BLPOP没有提供内置的功能。

如果您需要比上述工厂功能更复杂的客户端管理,则管理创建的多个连接的典型方法是使用连接池,但是node-redis不提供连接池。我通常通过Python代码访问Redis,因此我不建议使用Node.js库,但是node-redis显示了很多候选对象。

答案 1 :(得分:0)

就设计和性能而言,最好创建一个客户端并在整个应用程序中使用它。这在节点中很容易做到。我假设您使用的是redis npm软件包。

首先,创建一个名为redis.js的文件,其内容如下:

const redis = require('redis');

const RedisClient = (function() {
    return redis.createClient();
})();

module.exports = RedisClient

然后,在文件set.js中说,您将这样使用它:

const client = require('./redis');
client.set('key', 'value');

然后,在您的index.js文件中,可以将其导入并在退出时关闭连接:

const client = require('./redis');

process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);

function cleanup() {
    client.quit(function() {
        console.log('Redis client stopped.');
        server.stop(function() {
            console.log('Server stopped.');
            process.exit();
        });
    });
};

答案 2 :(得分:-1)

我认为只有一个连接更好。

module.exports = redis.createClient();

无需管理多连接。

表示redis。你可以使用redis-sentinel。

不过,你也可以使用ioredis