2011-10-31 49 views
2

目前,我有下面的代码,用Node.js的工作,socket.io和Redis的:节点退出时,干净地断开与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(); 
     }); 
    }); 
}); 

也能正常工作正常的插座连接和断开,但似乎如果节点宕机是一个问题,或者如果我只是重新启动节点作为正常发展的一部分。

关键不会从Redis中删除。因此,存储在Redis数据库中的条目数量逐渐增加并增长。我也不确定Redis客户端是否干净地存在。

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

回答

3

当节点退出时,您可以处理此操作,但例如,如果电力下降,您无法在关机时清除它。我会在启动时从数据库擦掉旧的东西。

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); 
}); 
1

我已经在这个问题上运行了。我的解决方案是在服务器上为Socket.io数据使用特定的Redis数据库。启动时对该数据库的一个简单的FLUSHDB将清除卡住的密钥。

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

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