当前位置: 首页 > 面试题库 >

Redis和Node.js和Socket.io问题

简嘉赐
2023-03-14
问题内容

我一直在学习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)连接来服务大量客户端是一种非常有效的策略。这避免了为每个客户端请求实例化和终止数据库连接的开销。



 类似资料:
  • 问题内容: 我可以不用密码就可以将Node应用程序连接到Redis,但是添加密码后,我无所事事。 这是我的代码,摘自一个示例: 在运行应用程序时,我得到以下堆栈跟踪: 生成该行的行是最后一个-如果我注释掉尝试设置RedisStore的尝试,则不会出现任何错误。 我确定密码正确(我可以在redis- cli中进行验证,如果我将密码更改为错误,则可以验证auth回调不会触发)。如果我删除密码并注释掉两

  • 问题内容: 我有一个在Rails和Backbone.js上运行的单页应用程序。我正在通过Redis使用Node.js将数据推送并同步到客户端。我正在尝试了解,保护和优化套接字通信。 使用console.log编写时,我看到一些日志行()正在重复(请参见下面的内容)。 有人能解释我为什么吗?通过我的代码实现,我是否不了解某些特定的Node.js行为? 这是我的Node.js代码: 这是我测试的方式,

  • 问题内容: 我希望让Socket.io 在Node.js v.0.6.0及更高版本中与本机负载平衡(“集群”)一起工作。 据我了解,Socket.io使用Redis存储其内部数据。我的理解是:不是要为每个工作人员生成一个新的Redis实例,而是要强制这些工作人员使用与主服务器相同的Redis实例。因此,连接数据将在所有工作人员之间共享。 像这样的主人: 我们必须以某种方式传递给工人并执行以下操作:

  • 问题内容: 我的socket.io版本是socket.io@0.8.7和redis@0.7.1。我在Windows上。 在某些地方,我已经看到问题已解决。我想我正在使用最新的socket.io版本。什么是generator.setMaxListeners(),在哪里可以设置? 我正在使用redis pubsub,当我订阅redis时,它会抛出此警告。 问题答案: 有一个与此相关的已知问题。好像是几

  • 问题内容: 我可以寻求您的帮助吗?我的代码不适用于使用socket.room创建房间,首先我已经声明了,我想创建房间并将创建的房间名称推送到。我的目标是允许用户创建自己的房间并在可能的情况下将其删除。我在这里使用了Michael Mukhin的代码作为参考。 这是我的server.js的代码 这是客户端index.html中的代码, 我想创建一个房间并将其添加到的列表中。 请帮助我已经阅读过soc

  • 问题内容: 谁能使用WebSockets(Socket.io)为Node.js提供坚如磐石,简单的单元测试? 我使用用于Node.js的socket.io,并查看了socket.io-client以在测试中建立与服务器的客户端连接。但是,我似乎缺少了一些东西。 在下面的示例中,“ worked …”从未被打印出来。 相反,我只是得到: 有什么建议? 问题答案: 经过进一步的摸索和探索,我发现了一些