【发布时间】:2012-01-20 19:36:34
【问题描述】:
我一直在学习redis和node.js 有两个问题我找不到满意的答案。
我的第一个问题是关于在 node.js 中重用 redis 客户端。我找到了这个问题和答案:How to reuse redis connection in socket.io?,但它并没有让我足够满意。
现在,如果我在连接事件中创建 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
}
});
}
});
});
所以,如果我学习正确,如果我需要等待 I/O 应答,我需要运行函数中的每个函数。否则,node.js 的非阻塞机制将允许第一个函数运行,这种情况下它会并行获取结果,但第二个函数如果需要时间获取,则可能没有结果。因此,例如,如果您从 redis 获取结果,并且您将在第二个函数中使用结果,则必须将其封装在 redis get 函数中。否则第二个函数将运行而没有得到结果。
所以,在这种情况下,如果我需要运行 7 个不同的函数并且 8. 函数需要所有这些函数的结果,我是否需要像这样递归地编写它们?还是我错过了什么。
我希望这也很清楚。
非常感谢,
【问题讨论】:
-
顺便说一句,要完成您对第二个问题的回答,您还可以查看流控制库“async”和“step”。