错误:Redis连接到127.0.0.1:6379失败 - 连接EMFILE

时间:2014-09-13 18:37:55

标签: node.js redis

所以我使用socket.io,redis和node.js创建了一个实时应用程序。

问题是有30个用户,我已经达到了服务器的连接数(我正在运行Ubuntu 14.04。

我认为它与我连接redis的方式有关。

所以在一个页面上,我最多有12个频道可以订阅。在两个socket.io连接上,一个有6个通道,另一个有另外6个通道。

在显示我的节点js代码之前,我做的是每个频道,我创建了一个新的redis客户端,所以假设我有一个插入更新通道,在node.js代码上,所以我的代码将是:

var data = io.of('/data');
data.on('connection', function(client) {
    var insert = redis.createClient();
    var update = redis.createClient();

    insert.subscribe('insert');

    insert.on("message", function(channel, message) {
        client.emit('data_insert', message);
    });

    update.subscribe('update');
    update.on("message", function(channel, message) {
        client.emit('data_update', message);
    });
});

我认为这就是问题所在,这就是为什么30个用户我超过了服务器连接的限制,因为30 * 12 + 2 * 30 = 420,还有其他几个用户,以及它很容易达到1024。

那么如何优化代码,将每个客户端的连接数减少到最多一个或两个?

data.on('connection')之外 var insert = redis.createClient(); 是否有帮助?

2 个答案:

答案 0 :(得分:1)

您不应该为每个客户端创建一个(或多个)redis连接 - 只需继续使用相同的全局连接。此外,没有理由为您要订阅的每个频道创建一个客户端。只需使用channel参数来确定哪些事情与数据有关(在这种情况下,你在每个频道上做同样的事情,所以更不用说分开它们了。)

var data = io.of('/data');
var redis = redis.createClient();
redis.subscribe('insert');
redis.subscribe('update');
data.on('connection', function(client) {
    redis.on("message", function(channel, message) {
        if(channel == 'insert')
            client.emit('data_insert', message);
        else if(channel == 'update')
            client.emit('data_update', message);
    });
});

可能有更好的方法可以做到这一点,但这是一个相当直接的代码转换为只使用一个redis连接的东西。

请注意,redis订阅者只能 订阅 - 您需要第二个客户端才能发布或执行任何其他redis操作。

答案 1 :(得分:-1)

使用socket.io的namespace。在每个命名空间中,您还可以定义房间,但命名空间应该足以满足您的需求。