当Node退出时,干净地断开与Redis的连接?

时间:2011-10-31 19:19:05

标签: javascript node.js redis socket.io

目前我有以下代码,使用Node.js,socket.io和Redis:

var io = require('socket.io'), redis = require("redis"), client = redis.createClient();
io.sockets.on('connection', function (socket) {
  var socket_id = socket.id;
  socket.on('chat', function(data) { 
      client.set('user:' + socket_id, data['colour']);         
      // The user left the page. Remove them from Redis.
      socket.on('disconnect', function () {
          client.del('user:' + socket_id);
          client.quit();
      });
  });
});

这适用于正常的套接字连接和断开连接,但是如果Node关闭,或者我只是重新启动Node作为正常开发的一部分,则似乎存在问题。

密钥永远不会从Redis中删除。因此,Redis数据库中存储的条目数逐渐增长和增长。我也不确定Redis客户端是否存在干净。

如何清除Redis条目并在节点退出时退出Redis客户端,以及套接字断开连接时?

3 个答案:

答案 0 :(得分:4)

您可以在节点退出时处理此问题,例如如果电源关闭,你无法在关机时清理它。我会在启动时从数据库中删除旧的东西。

答案 1 :(得分:1)

我也遇到过这个问题。我的解决方案是在服务器上使用特定的Redis数据库来获取Socket.io数据。启动时对该数据库的简单FLUSHDB将清除卡住的密钥。

var socketIoDatabase = 4;
var client = redis.createClient();
client.select(socketIoDatabase);
client.flushdb();

当然,如果您有多个节点进程使用同一个数据库清除它将导致问题。在这种情况下,您可以在维护窗口期间执行此操作,或者在所有节点进程终止时执行此操作。

答案 2 :(得分:0)

检查一下: http://nodejs.org/docs/v0.4.12/api/process.html#event_uncaughtException_

var io = require('socket.io'), redis = require("redis"), client = redis.createClient();
io.sockets.on('connection', function (socket) {
  var socket_id = socket.id;
  socket.on('chat', function(data) { 
      client.set('user:' + socket_id, data['colour']);         
      // The user left the page. Remove them from Redis.
      socket.on('disconnect', function () {
          client.del('user:' + socket_id);
          client.quit();
      });
  });
});

// this will be activated on any error without try catch :)
process.on('uncaughtException', function (err) {
   console.log('Caught exception: ' + err);
});