Redis 和 Node.js 以及 Socket.io 问题

2024-01-23

我刚刚学习 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. 函数需要所有函数的结果,我是否需要像这样递归地编写它们?或者我错过了什么。

我希望这也很清楚。

多谢,


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

事实上,你不是:)

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis 和 Node.js 以及 Socket.io 问题 的相关文章

随机推荐

  • 使用 maven-compiler-plugin 排除包适用于一个包,但不适用于另一个包

    我的项目具有以下包结构 src com my app school course Course java com my app school course free CourseFree java 我使用Maven来构建项目 在我的pom
  • 使用 Stateful Session Bean 来跟踪用户的会话

    这是我的第一个问题 我希望我做得对 我需要从事 Java EE 项目 因此 在开始之前 我尝试做一些简单的事情 看看是否能做到 我被困住了有状态会话 Bean 这是问题 我怎样才能使用SFSB跟踪用户的会话 我看到的所有例子最终都 放入 S
  • UIBezierPath:roundedRect:byRoundingCorners:cornerRadii:行为怪异

    我正在尝试将按钮的两个角变成圆形 如果我像这样选择 TopLeft 和 BottomLeft let bezierDisableAdsPath UIBezierPath roundedRect disableAdsButton bounds
  • Gitlab Pages:无法验证域所有权

    今天早上 我收到了针对托管在自定义域上的每个 Gitlab 页面的电子邮件 称域验证失败 没关系 因为我认为我一开始就没有验证过它们 Gitlab 很好地实现了这一点 当我转到每个存储库的 设置 gt 页面 gt Domain Detail
  • 一个 SVG 文件,里面有很多 SVG 渐变

    我正在制作一组使用动态渐变的按钮 我已经通过使用 Firefox 3 6 和 WebKit 专有的 CSS 扩展来处理它们 我所需要做的就是使用 background image url gradient svg 支持 Opera iOS
  • phpExcel:无法加载资源:net::ERR_CONNECTION_RESET

    我实际上使用 phpExcel 来获取一个 excel 文件 我用一个命令从用户那里恢复该文件
  • Shiny 未检测到shiny:inputchanged 事件

    如果应用程序能够检测到上次单击或更新的小部件的 ID 那么我为闪亮的应用程序设计所采用的方法将是最简单的 This https stackoverflow com q 72061061 7742981问题的出现解决了问题 然而 当我使用接受
  • 从 Rails3-jquery-autocomplete 自定义列表

    我有一个hotel模型及其属性是 id hotel name address searchable 当我设置可搜索时false对于特定酒店 当我在搜索字段中输入时 该酒店不应出现在下拉列表中 控制器是 class HotelsControl
  • 表情符号字符变灰(HTML / CSS)

    我当前的问题是我正在尝试将带有表情符号的按钮灰显 尽管如此 由于表情符号的性质 似乎无法使用 HTML CSS 属性更改颜色 I e
  • xib 文件的 iPhone 本地化

    我刚刚熟悉 xib 文件的本地化 想知道是否有一种方法可以通过直接引用 plist 来本地化 xib 中的字符串 欣赏一些想法 如果您不想直接本地化 xib 文件 则可以将它们包含的文本提取到 strings 文件中 并且在翻译 strin
  • 如何使用node.js测试文件权限?

    如何检查正在运行的 Node js 进程对给定文件的权限 读 写 执行 我希望fs Stats object http nodejs org docs latest api fs html fs class fs stats有一些有关权限的
  • Django 外键值的精确匹配

    class Sentence Model name CharField class Tokens Model token CharField sentence ForeignKey Sentence related name tokens
  • 如何在 android 中模拟 Kotlin 对象?

    我在 kotlin 中有一个对象控制当前用户的会话信息 我想模拟有回调的登录方法 在测试时 我需要在 SessionController 对象中模拟此方法 object SessionController fun signIn userna
  • Java (J2SE) DTMF 音调检测

    我正在尝试执行以下操作 我正在使用我的 java 应用程序给另一个人打电话 已经完成并且工作正常 然后我正在播放录音 例如 请按 1 一继续英语 已经完成且工作正常 现在我想检测那个人按 1 根据我在 google 搜索中的研究 我发现这可
  • 如何在 Excel 中将 hhmmAM/PM(无空格)格式化为时间 hh:mm AM/PM?

    我正在开发一个薪资项目 为了提高数据输入效率 我希望以 hhmmAM PM 格式输入时间 没有空格或冒号 最好只输入 a p 而不是 AM PM 并将其转换为标准带有冒号和空格的时间格式 谢谢 这是一个为列编码的小宏A 可以对其进行修改以处
  • 增加火花任务大小[重复]

    这个问题在这里已经有答案了 当我在 Spark Shell 中执行代码时遇到问题 Stage 1 gt 0 0 16 17 01 13 06 09 24 WARN TaskSetManager Stage 1 contains a task
  • 如何处理“超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)”。

    我被要求创建脚本 希望运行它的人提供员工 ID 找到所提供的员工任意深度监督的所有员工 我的代码是 CREATE FUNCTION dbo GetNames V uniqueidentifier RETURNS OldNames TABLE
  • 为什么 R 的重复数据在排序数据上表现更好?

    在比较答案中两个函数的效率时检查列表是否包含 R 中的另一个列表 https stackoverflow com a 39350733 4408538 我偶然发现了一个有趣的结果 排序大大提高了效率duplicated当向量很大时 这让我感
  • 在 PropertyGrid 中设置只读属性将所有属性设置为只读

    我正在使用一个PropertyGrid控件来编辑我的类属性 并且我尝试根据其他属性设置将某些属性设置为只读 这是我班级的代码 Imports System ComponentModel Imports System Reflection P
  • Redis 和 Node.js 以及 Socket.io 问题

    我刚刚学习 redis 和 node js 有两个问题我找不到任何令人满意的答案 我的第一个问题是关于在 Node js 中重用 Redis 客户端 我找到了这个问题和答案 如何在socket io中重用redis连接 https stac