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

Javascript Node.js:关闭所有Redis客户端,javascript,node.js,redis,node-redis,Javascript,Node.js,Redis,Node Redis,今天,我将Redis集成到node.js应用程序中,并将其用作会话存储。基本上,在成功进行身份验证后,我将相应的用户对象存储在Redis中 当我在身份验证后收到http请求时,我尝试使用散列从Redis检索用户对象。如果检索成功,则意味着用户已登录,并且可以满足请求 在Redis中存储用户对象的行为和检索发生在两个不同的文件中,因此每个文件中都有一个Redis客户端 问题1: 有两个Redis客户端,每个文件一个,可以吗?或者我应该只实例化一个客户机并在应用程序的所有区域使用它吗 问题2: no

今天,我将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();
    });
};

我认为只有一个连接更好

module.exports=redis.createClient()

没有必要管理多个连接

对于redis。你可以使用redis sentinel


顺便说一句,您还可以在设计和性能方面使用ioredis,最好创建一个客户端并在整个应用程序中使用它。这在node中很容易做到。我假设您使用的是
redis
npm包

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

constredis=require('redis');
const RedisClient=(函数(){
返回redis.createClient();
})();
module.exports=RedisClient
然后,假设在文件
set.js
中,您可以这样使用它:

const client=require('./redis');
set('key','value');
然后,在您的
index.js
文件中,您可以导入它并在退出时关闭连接:

const client=require('./redis');
进程上('SIGINT',清除);
进程。on('SIGTERM',清除);
函数清理(){
client.quit(函数(){
log('Redis客户端已停止');
server.stop(函数(){
log('服务器已停止');
process.exit();
});
});
};

应用程序使用Redis的方式可能要求使用多个连接

例如,一旦连接用于收听发布/订阅频道,那么它只能用于此目的,而不能用于其他目的。根据以下文件:

一旦客户端进入订阅状态,它就不应该发出任何其他命令,除了附加的
SUBSCRIBE
PSUBSCRIBE
UNSUBSCRIBE
PUNSUBSCRIBE
命令

因此,如果您的应用程序需要订阅频道并使用Redis作为通用值缓存,那么它至少需要两个客户端:一个用于订阅频道,另一个用于使用Redis作为缓存

还有一些Redis命令像块一样阻塞。繁忙的web服务器通常一次回复多个请求。假设为了响应请求,服务器使用其Redis客户端发出阻塞命令。然后请求B来了,服务器需要用非阻塞命令应答Redis,但客户端仍在等待为请求a发出的阻塞命令完成。现在,对请求B的响应被另一个请求延迟。这可以通过为第二个请求使用不同的客户端来避免

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

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


如果您需要比上述工厂功能更复杂的客户端管理,那么管理创建的多个连接的典型方法是使用连接池,但不提供连接池。我通常通过Python代码访问Redis,所以我没有Node.js库的推荐,但an显示了很多候选库。

客户端指的是连接?或者由redis.createClient()返回的客户端。
?哦,是的,连接。基本上,“client=redis.createClient();”我使用的是redis集群。在数千次请求之后,由于redis中的失败,请求失败