我刚刚学习 redis 和 node.js 有两个问题我找不到任何令人满意的答案。
我的第一个问题是关于在 Node.js 中重用 Redis 客户端。我找到了这个问题和答案:如何在socket.io中重用redis连接? https://stackoverflow.com/questions/5739357/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 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. 函数需要所有函数的结果,我是否需要像这样递归地编写它们?或者我错过了什么。
我希望这也很清楚。
多谢,