在节点中从文件与数据库中提供内容

Posted

技术标签:

【中文标题】在节点中从文件与数据库中提供内容【英文标题】:serve content from file vs database in node 【发布时间】:2016-03-31 09:38:29 【问题描述】:

我正在制作一个旧静态网站的新版本,该网站已发展到 50 多个静态页面。

所以我用旧内容制作了一个 JSON 文件,这样新网站就可以是更多的 CMS(带有通用页面的模板),因此后端变得更加干燥。

我想知道我是否可以将这些内容从 JSON 中提供给我的视图,或者我是否应该将它放在 mysql 数据库中?

我正在使用 Node.js,在 Node 中我可以将该 JSON 文件存储在内存中,因此当用户请求数据时不会读取文件。

这有正确的做法吗?它们在提供缓存的 JSON 文件或通过 MySQL 之间是否存在性能差异?

有问题的文件大约是 400Kb。如果文件大小与选择一种技术而不是另一种技术有关?

【问题讨论】:

我看到投票结束了。这是否意味着性能差异不够大,采取哪种方法是个人意见? 这意味着有很多方法可以解决一个任务。哪一个最好取决于太多的因素,包括你自己的技能和偏好。对于这样一个适用于更广泛公众的问题,不可能有一个单一的答案。 @Tomalak 我可以缩小/决定使这个问题更好、更容易回答的因素是什么? 嗯,关于 SO 的问题的所需格式将是一个特定的问题,伴随着特定的代码示例和对特定技术/库的限制,即最终构成非常广泛的非常狭窄的范围问题。对行动/最佳实践或图书馆的建议很快就会过时,而且它们往往没有明显的对错,这会引发开放式讨论,这不是这个特定网站的目标。 【参考方案1】:

为什么要添加另一层间接?直接从 JSON 提供视图。

【讨论】:

这就是我的想法,您仍然为用户提供相同数量的数据,mysql 连接只会减慢一点 afaik。但我可能是错的:) mysql 将从磁盘提供数据,这比从 RAM 提供数据要慢得多,这正是 OP 想知道的。 @hd1 不,mysql 也会在 RAM 中缓存内容。真正的问题不是你将动态系统基于什么(一个为每个请求从头开始构建页面的系统,即使该构建过程的结果只会在视图模板更改时有所不同,所以基本上从不),但是是否创建一个生成静态页面一次然后在模板或内容更改时简单地重新生成它们的系统将是更好的选择。【参考方案2】:

通常情况下,数据库用于服务动态变化的内容,记录是一对多或多对多的关系,需要根据各种条件查询数据。

在您描述的情况下,看起来您可以将 JSON 文件缓存在服务器内存中。只要确保在文件内容更改时更新缓存,即通过重新启动服务器、通过 http 请求触发缓存更新或在文件系统级别监视文件。

除此之外,您应该考虑在服务器和浏览器上缓存静态文件以获得更好的性能

    启动时在服务器内存中缓存和 Gzip 静态文件(html、js、css、jpg)。这可以使用像 connect-static 这样的 npm 包轻松完成 通过设置适当的响应标头来使用客户端的浏览器缓存。一种方法是在 Express 路由定义中添加 maxAge 标头,即:

app.use "/bower", express.static("bower-components", maxAge: 31536000)

Here 是一篇关于浏览器缓存的好文章

【讨论】:

【参考方案3】:

如果您已经将视图存储为 JSON 并使用 Node,则可能值得考虑使用 MEAN 堆栈(MongoDB、Express、Angular、Node):

http://meanjs.org/ http://mean.io/

通过这种方式,您可以在 JS 中编写整个代码,包括 MongoDB 中的文档存储。 我应该指出我自己没有使用过 MEAN。

MySQL 可以存储和提供 JSON 没有问题,但由于它不解析它,所以它非常不灵活,除非你将它分成组件并且在文档中建立索引几乎是不可能的。

您是否“应该”这样做完全取决于您的个人项目以及它是否/它可能如何发展。

当您正在实施网站的新版本(使用 CMS)时,这表明它是实时的并且会受到增长或更改的影响,并且可能将 JSON 存储在 MySQL 中会为未来存储问题。如果它真的只是一个文件,那么现在从文件系统中提取并将其缓存到 RAM 中可能会更容易。

我之前为我们的项目将 JSON 存储在 MySQL 中,但在除少数小众案例之外的所有情况下,最终都会拆分组件数据。

【讨论】:

【参考方案4】:

400KB 很小。所有数据都将保存在 RAM 中,因此 I/O 不会成为问题。

动态构建页面 - 所有重量级人物都这样做,如果没有其他原因,除了插入广告。 (我曾经在这样一家公司的内部工作。一直有数百万页在运行;只有少数是“静态的”。)

哪个 CMS - 可供选择的内容太多。选择一对听起来容易的;然后看看你能不能适应他们。然后在它们之间进行选择。

Linux/Windows;阿帕奇/Tomcat/nginxphp/Perl/Java/VB。同样,您的舒适程度是这个小型网站的重要标准;他们中的任何一个都可以完成这项任务。

哪里会出错?我敢肯定,您遇到过渲染速度极慢的网页。因此,显然有可能走错方向。你已经在换档了;如果你的决定并不完美,请准备好在一两年后换档。

请避免任何在 EAV(键值)架构中过于繁重的 CMS。它们可能适用于 400KB 的数据,但难以扩展。

【讨论】:

【参考方案5】:

如果您的数据大小将来不会增长,那么直接从 RAM 本身提供 json 是一种很好的做法。但是如果将来数据要增加,那么它将成为最糟糕的应用案例。

【讨论】:

【参考方案6】:

如果您不希望添加(m)任何新页面,我会选择最简单的解决方案:将 JSON 读取一次到内存中,然后从内存中提供服务。 400KB 是非常小的内存。

无需涉及数据库。当然,你可以做到,但在这里有点矫枉过正。

【讨论】:

【参考方案7】:

我建议在构建时生成静态 html 内容(使用 grunt 或 ..)。如果您想应用更改,请触发构建并生成静态内容并进行部署。

【讨论】:

以上是关于在节点中从文件与数据库中提供内容的主要内容,如果未能解决你的问题,请参考以下文章

在一个云功能中从 firebase 数据库中检索多个数据

如何在 Django 中从 MongoDB 提供图像文件

在递归节点函数中从 Mongoose 检索树数据

在 Powershell 中从非常大的 XML 文件中删除节点

如何在 docker 中从一个容器获取数据到另一个容器?我收到 ECONNREFUSED 错误

在js中从mysql中查询内容