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

Posted

技术标签:

【中文标题】Node.js + Express + Redis,何时关闭连接?【英文标题】:Node.js + Express + Redis, when to close connection? 【发布时间】:2014-04-18 16:37:42 【问题描述】:

我有一个使用Express 和node_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!' );
);

【问题讨论】:

【参考方案1】:

您有几个选择。

    懒惰并为redis服务器上的所有客户端设置空闲超时。然后,当客户端空闲时间过长时,服务器就会终止他们的连接。 节点进程退出时终止连接。

.

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

【讨论】:

您只能在“exit”事件处理程序中执行同步操作。该进程将在任何“退出”命令发送到 redis 服务器之前终止。 close() 函数不存在。使用 redisClient.quit(); 如果你无论如何都在杀死节点进程,为什么你需要显式“退出”redis客户端?当节点进程死亡时,任何与之关联的连接资源都将被释放/断开。【参考方案2】:

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

您可以让nodejs进程监听SIGINT,这是通过以下代码从键盘发送的中断

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

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

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

【讨论】:

除了 SIGINT,听 SIGTERM 来处理kill <process id> 命令也可能会有所帮助 @ifelsemonkey 这也很有意义。

以上是关于Node.js + Express + Redis,何时关闭连接?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js Redis lpush 错误

如何在我的简单 Express 应用中使用 Node.js 集群?

Docker + fig / compose + nginx + node.js + mysql + redis

Socket.io和Redis写Realtime App 之express初试

nodejs在redis失败时终止

基于Node.js开发个性化全网内容抓取平台