Redis和Node.js以及Socket.io问题

Mer*_*inn 6 redis node.js

我一直在学习redis和node.js我有两个问题,我找不到任何令人满意的答案.

我的第一个问题是在node.js中重用redis客户端.我找到了这个问题并回答:如何在socket.io中重用redis连接?,但它并不能让我满意.

现在,如果我在连接事件中创建redis客户端,它将为每个连接生成.因此,如果我有20k并发用户,那么将有20k redis客户端.

如果我把它放在连接事件之外,它只会产生一次.

答案是说他在连接事件之外为每个函数创建了三个客户端.

但是,据我所知,MySQL在编写生成子进程并并行运行的应用程序时,需要在创建子实例的函数中创建MySQL客户端.如果你在它之外创建它,MySQL将给出"MySQL服务器已经消失"的错误,因为子进程将尝试使用相同的连接.应该分别为每个子进程创建它.

因此,即使您为每个函数创建了三个不同的redis客户端,如果您有30k并发用户同时发送2k个消息,那么您应该遇到同样的问题,对吧?因此,每个"用户"都应该在连接事件中拥有自己的redis客户端.我对吗?如果没有,node.js或redis如何处理并发请求,与MySQL不同?如果它有自己的机制并在redis客户端中创建类似子进程的东西,为什么我们需要创建三个不同的redis客户端呢?一个应该就够了.

我希望这个问题很明确.

- 更新 -

我找到了以下问题的答案.http://howtonode.org/control-flow 无需回答,但我的第一个问题仍然有效.

- 更新 -

我的第二个问题是这个.我在JS和Node.js上也不是那么擅长.所以,据我所知,如果你需要等待一个事件,你需要在第一个函数中封装第二个函数.(我还不知道术语).让我举个例子;

socket.on('startGame', function() {
    getUser();
    socket.get('game', function (gameErr, gameId) {
        socket.get('channel', function (channelErr, channel) {
            console.log(user);
            client.get('games:' + channel + '::' + gameId + ':owner', function (err, owner) { //games:channel.32:game.14
                if(owner === user.uid) {
   //do something
                }
            });
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

所以,如果我正确学习它,我需要运行函数中的每个函数,如果我需要等待I/O答案.否则,node.js的非阻塞机制将允许第一个函数运行,在这种情况下,它将并行获得结果,但如果需要时间,第二个函数可能没有结果.因此,如果您从redis获得结果,并且您将在第二个函数中使用结果,则必须将其封装在redis get函数中.否则第二个函数将运行而不会得到结果.

所以,在这种情况下,如果我需要运行7个不同的函数,而8.函数将需要所有函数的结果,我是否需要递归地这样写它们?或者我错过了什么.

我希望这也很清楚.

非常感谢,

Phi*_*ier 2

因此,每个“用户”都应该在连接事件中拥有自己的 Redis 客户端。我对吗?

事实上,你不是:)

事实是,node.js 与 PHP 等非常不同。Node.js 不会在新连接上生成子进程,这是它可以轻松处理大量并发连接(包括长期连接(Comet、Websockets 等))的主要原因之一。Node.js 使用单个进程中的事件队列按顺序处理事件。如果您想使用多个进程来利用多核服务器或多服务器,则必须手动执行此操作(但如何执行此操作超出了本问题的范围)。

因此,使用单个 Redis(或 MySQL)连接来服务大量客户端是一种完全有效的策略。这避免了为每个客户端请求实例化和终止数据库连接的开销。