Node.js + Express + Redis,何时关闭连接?

20
我有一个使用Expressnode_redis的Node应用程序。我正在遵循Learning Node书中概述的方法,并为整个应用程序的生命周期创建单个客户端。在这种方法下,我何时调用redis客户端上的close()?我需要吗?
相关代码
var express = require( 'express' ),
    redis = require( 'redis' );

var app = express(),
    config = require( './config/application' )[ app.get( 'env' ) ];

// create Redis client
var redisClient = redis.createClient();
redisClient.on( 'error', function( err ) {
  console.log( 'Error' + err );
} );
// select the database
redisClient.select( config.redis_database );

...
/* more setup, route defintions, etc. */
...

http.createServer( app ).listen( 4000, function() {
  console.log( 'Server started and ready for action!' );
});
2个回答

19

你有两个选择。

  1. 可以选择懒一点,为redis服务器上的所有客户端设置空闲超时时间。当客户端长期处于空闲状态时,服务器将终止它们的连接。
  2. 在节点进程退出时终止连接。

.


你有两个选择。

  1. 可以懒一点,为 redis 服务器上的所有客户端设置空闲超时时间。这样,当客户端长时间处于空闲状态时,服务器会终止其连接。
  2. 在 Node 进程退出时终止连接。

.

process.on("exit", function(){
    redisClient.quit();
});

5
你只能在“退出”事件处理程序内执行同步操作。在发送任何“quit”命令到Redis服务器之前,进程将会中止。 - Maxim
1
close()函数不存在。请使用redisClient.quit(); - gyss
3
如果您无论如何都要终止节点进程,为什么还需要显式地“退出”Redis客户端呢?当节点进程停止时,与其相关的任何连接资源都将被释放/断开。 - Phil
@Phil,你的意思是如果我断开与数据源的连接,就没有必要断开Redis的连接了吗? - HackerMF

7

这个问题是3年前的,你可能已经得到答案了,但对于一些新手来说,这可能仍然有用。

您可以使用以下代码使nodejs进程监听从键盘发送的中断信号SIGINT

process.on('SIGINT', function() {
    redisClient.quit();
    console.log('redis client quit');
});

然后您可以通过键盘输入Ctrl+C,或通过kill -SIGINT <process id>发送这样的信号。当发生这种情况时,该代码将被执行。

当我们不知道什么时候退出redis客户端,或者我们希望外部控制清除我们正在使用的资源时,就会出现这种情况。


1
除了 SIGINT 之外,还有监听 SIGTERM 可以用来处理 kill <process id> 命令。 - daparic
@ifelsemonkey 这也很有道理。 - haxpor
最终,没有理由停止执行每个请求吗?我的意思是,例如,我们有很多不同的请求。在其中一些请求中,我们需要获取一些redis数据。难道每个请求都要建立连接,并在该请求结束时断开连接,这样做没有任何理由吗? - HackerMF
@daparic 附加说明:在Windows上不支持SIGTERM信号。但可以监听它。SIGILLSIGTERM信号在Windows下不会生成,它们只是为了ANSI兼容性而包含在内。请参考microsoft文档nodejs文档 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接