【问题标题】:Keep data for node app when alive活着时保留节点应用程序的数据
【发布时间】:2023-03-25 21:00:01
【问题描述】:

我有节点应用程序,我需要保留数据(只要节点应用程序还活着),它将为用户请求提供服务,(我不想为每个请求计算/解析它,所以我只做一次...... ) , 当节点应用程序关闭时,我不再需要这些数据。

我发现了以下(有效),但不确定这是不是最好的方法 有什么缺点的话。

这是我正在使用的东西

require.cache.persist.myData = myData;

我将 node 与 express 一起使用

【问题讨论】:

  • 听起来您当前的方法缓存了所有会话/用户的数据(每个应用实例存储的数据)。如果此数据与会话相关(每个会话实例存储的数据),您可能希望使用会话数据。我找到了这篇文章,如果它有帮助的话。 codeforgeek.com/2014/09/manage-session-using-node-js-express-4
  • 尝试使用 node-cache 进行缓存。我会使用合适的数据库。npmjs.com/package/node-cache
  • 为什么不先将数据解析后保存到文件中。在文件名中使用本地 sessionID 以使其与应用程序实例保持相关。应用关闭时将其删除。
  • 我使用 memcached 来处理这些东西。很棒的是缓存可以在我的应用程序的实例之间共享,并且在应用程序重启后它仍然存在。
  • 如果您在服务器的生存期内只需要一些东西 - 只需将它们存储在一个对象中。它非常简单,您不必使用任何类型的包。只需使用一个文件,导出一个对象并开始在其中放入东西 :)

标签: javascript node.js express require


【解决方案1】:

您可以将node-cache-manager 与内存存储一起使用:

var cacheManager = require('cache-manager');
var memoryCache = cacheManager.caching({store: 'memory', max: 100, ttl: 10/*seconds*/});
var ttl = 5;
// Note: callback is optional in set() and del().

memoryCache.set('foo', 'bar', {ttl: ttl}, function(err) {
    if (err) { throw err; }

    memoryCache.get('foo', function(err, result) {
        console.log(result);
        // >> 'bar'
        memoryCache.del('foo', function(err) {});
    });
});

【讨论】:

    【解决方案2】:

    有很多方法可以使数据持久化,具体取决于您需要的持久性级别。我将在下面概述一些方法。


    应用程序级持久性

    当您需要数据在Node 应用程序正在运行时保持可用时。如果它停止或崩溃,数据就会丢失。这是最容易解决的问题,我认为您在应用程序中寻找的级别。

    在程序停止之前,您的 Node 程序加载到内存中的任何内容都将保持可访问性。因此,如果您的程序以该行开始

    var myData = { ... };
    

    然后 myData 将保留在内存中,并且可以从该文件中访问,只要应用程序这样做。您可以使用require("./data.js") 从另一个文件加载数据,其中data.js 的内容必须导出您的数据:

    module.exports = { ... };
    

    From the docs:

    多次调用 require('foo') 可能不会导致模块代码被多次执行。

    require 缓存data.js 的执行结果,并在每次后续请求时从缓存中提供它们。您的代码只是将数据直接放在该缓存中,而无需执行外部文件。

    没有比上述策略有任何特别的优势。

    如果你有一个文件,你也可以随意重复使用变量myData - 它不会去任何地方。 您不需要显式缓存它。 如果您有多个文件,则应按预期使用require('foo') 函数。


    会话级持久性

    当您需要数据保持从一个请求到另一个请求对某些个人用户可用时。请注意,这通常比应用程序级别的持久性弱。如果应用程序在单个用户的两次访问之间崩溃并重新启动,则缓存的数据可能会丢失。如果这有问题,请参阅此答案的最后一部分。

    要使用 express 实现这一点,您需要安装 express-session 包。它非常易于使用。像任何其他模块一样包含它,告诉 express 将其用作中间件,您会发现自己拥有一个持久的req.session 对象,您可以在其中存储数据。

    例如:

    var session = require('express-session');
    var app = express();
    app.use(session({secret: 'ssshhhhh'}));
    
    app.get('/',function(req,res){
        req.session = myData;
    }
    

    全局持久性

    当您需要数据变得可用时即使在应用程序停止后。当应用程序恢复时,您可以从上次中断的地方继续。

    这个问题最常使用外部数据库来解决。 Node 将您的数据传递到其他一些应用程序(例如 MySQL、MongoDB、...),并且他们有责任照顾它。当您再次需要数据时,即使在重新启动后,您也可以简单地向他们索取。

    然而,在许多情况下,仅仅为了数据的持久性而设置数据库是不必要的。 将您的数据写入本地文件会更容易,即使您的应用程序崩溃,您也可以相信它会保持原样。在几乎所有情况下,这都比使用数据库快得多。

    您可以使用fs 内置模块轻松地自己完成此操作,或使用预制解决方案,例如node-persist。在这种情况下,全局持久化很简单:

    var storage = require('node-persist');
    storage.initSync();
    storage.setItem('myPersistentData', { ... });
    console.log(storage.getItem('myPersistentData'));
    

    【讨论】:

    • 不错的答案,+1 写它的努力。不过,我不建议使用 node-persist - 更好的是像 Mongo 或 Redis 这样的真实存储系统。但是第一部分,使用内存变量是好的。我建议作者使用它:)
    • 谢谢!事实上,我对这两个系统都没有太多经验。他们的优势是什么?与仅写入文件系统相比,我无法想象它们提供了速度优势......
    • 哦,尤其是 Redis 提供了更多! :) 它是内存和文件存储之间的一种混合体——它不能保存用于驱动的​​信息,而是尽可能多地保存在内存中。因此,它非常快速和可靠。而且它还非常可扩展 - 您可以运行多个实例并在它们之间轻松共享信息。在系统上保存文件以后会很痛苦。当然,我说的是比将一些变量保存到对象更大的项目:)
    • @Hephistocles - 感谢您的回答 1+!目前有两个问题:) 1.只是为了验证我使用的 require.cache.persist.myData 不是使用的好习惯?2.假设我选择你的第一个选项我可以想象带有 getter 和 setter 的模块,这就是你的看法还?如果是的话,你能提供简单的例子吗?提前谢谢!
    • 如果您认为我已经回答了这个问题,请点击“接受”按钮!我会说使用require.cache.persist 并不是什么坏习惯——它只是毫无意义。通过简单地定义var myPersonalCache = {},然后像myPersonalCache.myData = myData 一样使用它,您将获得同样多的持久性。同样,我认为定义 getter 和 setter 可能比你需要的更多 - 如果你想在多个文件之间访问你的数据,你可以简单地做 module.exports = myData
    【解决方案3】:

    我相信您希望在应用程序的服务器端缓存数据。如果是这种情况,那么使用可以使用node-cache npm 此外,还有一个名为 node-persist 的 npm 使用 HTML5 本地存储功能的 API。 Try it from here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多