小编典典

Redis和Node.js和Socket.io问题

redis

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

我的第一个问题是关于在node.js中重用Redis客户端。我找到了这个问题和答案:如何在socket.io中重用Redis连接,但还不足以让我满意。

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

如果我将其放在连接事件之外,它将仅产生一次。

答案是说,他在连接事件之外为每个功能创建了三个客户端。

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

因此,即使为每个功能创建三个不同的Redis客户端,如果您有30k并发用户并发发送2k消息,也应该遇到相同的问题,对吗?因此,每个“用户”都应在连接事件中拥有自己的redis客户端。我对吗?如果不是,与MySQL不同,node.js或redis如何处理并发请求?如果它具有自己的机制并在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
                }
            });
        }
    });
});

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

因此,在这种情况下,如果我需要运行7个不同的函数,而8.函数将需要所有这些函数的结果,那么是否需要像这样递归编写它们?还是我错过了一些东西。

我希望这也很清楚。

非常感谢,


阅读 517

收藏
2020-06-20

共1个答案

小编典典

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

实际上,您不是:)

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

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

2020-06-20