我一直在学习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.函数将需要所有这些函数的结果,那么是否需要像这样递归编写它们?还是我错过了一些东西。
我希望这也很清楚。
非常感谢,
因此,每个“用户”都应在连接事件中拥有自己的redis客户端。我对吗?
实际上,您不是:)
事实是,node.js与PHP非常不同。node.js不会在新的连接上生成子进程,这是它可以轻松处理大量并发连接(包括长期连接(Comet,Websocket等))的主要原因之一。node.js在一个进程中使用事件队列顺序处理事件。如果要使用多个进程来利用多核服务器或多台服务器,则必须手动进行(但是,如何做超出了此问题的范围)。
因此,使用一个单一的Redis(或MySQL)连接来服务大量客户端是一种非常有效的策略。这避免了为每个客户端请求实例化和终止数据库连接的开销。