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

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

【问题讨论】:

    标签: node.js express node-redis


    【解决方案1】:

    您有几个选择。

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

    .

    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 这也很有意义。
    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多