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

Bar*_*cha 13 node.js express node-redis

我有一个使用Expressnode_redis的Node应用程序.我正在遵循学习节点手册中概述的方法,并在应用程序的生命周期中创建单个客户端.鉴于这种方法,我什么时候打电话close()给redis客户端?我还需要吗?

相关代码

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!' );
});
Run Code Online (Sandbox Code Playgroud)

aem*_*bke 8

你有几个选择.

  1. 懒惰并为redis服务器上的所有客户端设置空闲超时.然后当客户端闲置太久时,服务器就会终止它们的连接.
  2. 节点进程退出时终止连接.

.

process.on("exit", function(){
    redisClient.quit();
});
Run Code Online (Sandbox Code Playgroud)

  • 您只能在"exit"事件处理程序中执行同步操作.在将任何"退出"命令发送到redis服务器之前,该进程将会死亡. (3认同)
  • 如果无论如何都要终止节点进程,为什么需要显式“退出”redis 客户端?当节点进程终止时,与其关联的任何连接资源都将被释放/断开。 (3认同)

hax*_*por 5

: 这个问题是 3 年前的问题,你可能已经得到了答案,无论如何这可能对一些新人有用。

您可以SIGINT通过以下代码使 nodejs 进程侦听从键盘发送的中断

process.on('SIGINT', function() {
    redisClient.quit();
    console.log('redis client quit');
});
Run Code Online (Sandbox Code Playgroud)

然后您可以Ctrl+C从键盘或通过kill -SIGINT <process id>. 发生这种情况时,将执行该代码。

这是我们不知道何时退出 redis 客户端,或者我们希望外部控制干净地退出/清除我们正在使用的资源的时候。