Javascript 当节点退出时,是否干净地断开与Redis的连接?

Javascript 当节点退出时,是否干净地断开与Redis的连接?,javascript,node.js,redis,socket.io,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) { cli

目前,我使用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();
      });
  });
});
这对于正常的套接字连接和断开连接很好,但如果节点宕机,或者作为正常开发的一部分,我只是重新启动节点,则似乎会出现问题

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


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

当节点退出时,您可以处理此问题,但例如,如果断电,您无法在关机时清理。我会在启动时清除数据库中的旧内容。

检查以下内容:


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

var socketIoDatabase = 4;
var client = redis.createClient();
client.select(socketIoDatabase);
client.flushdb();
当然,如果有多个节点进程使用同一个数据库,那么清除它将导致问题。在这种情况下,您可以在维护窗口期间或在所有节点进程终止时执行此操作

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