【问题标题】:Disconnect from Redis cleanly when Node exits?Node退出时干净地断开与Redis的连接?
【发布时间】:2011-10-31 19:19:05
【问题描述】:

目前我有以下代码,使用 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 客户端Node 退出时,以及套接字断开连接时?

【问题讨论】:

    标签: javascript node.js redis socket.io


    【解决方案1】:

    你可以在节点退出时处理这个问题,但是例如万一断电,您无法在关机时清理它。我会在启动时从数据库中擦除旧的东西。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        检查一下: 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);
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-05
          • 2012-06-01
          • 1970-01-01
          • 2020-03-31
          • 2022-01-24
          • 2016-10-10
          • 2021-09-01
          • 1970-01-01
          相关资源
          最近更新 更多