云功能Http请求返回缓存的Firebase数据库

时间:2017-04-20 11:27:25

标签: node.js caching firebase firebase-realtime-database google-cloud-functions

我是Node.js和Firebase的Cloud Functions的新手,我会尝试专门针对我的问题。

我有一个firebase-database,其中的对象包括“score”字段。我希望基于此检索数据,这可以在客户端轻松完成。

问题在于,如果数据库变得越来越大,我担心返回和/或消耗大量资源需要花费太长时间。这就是为什么我在考虑一个使用Cloud Functions来存储缓存的http服务,其中前N个对象会在任何对象的分数随着监听器而改变时自行更新。

然后,客户端只需要调用https://myexampleprojectroute/givemethetoplevels之类的东西来接收前N级的Json。

合理吗?如果是这样,我该如何处理?我需要哪些结构来使用此缓存,以及如何通过http?

以json格式返回它们

目前我会继续做客户端,但我真的很想将它用于性能和学习目的。

提前致谢。

修改

最后我没有实现优化。原因是,首先,firebase数据库不包含“子计数”,所以我没有找到一种方法用我的新手javascript知识来实现​​它。其次,最重要的是,我很确定它不会扩展到数百万,最多有10K条目,而firebase有排序读取优化的规则。有关详细信息,请查看this link.

另外,我会发布一个简单的代码片段,通过使用云函数的http请求从数据库中检索数据,以防有人在寻找它。希望这有帮助!

// Simple Test function to retrieve a json object from the DB
// Warning: No security methods are being used such authentication, request methods, etc
exports.request_all_levels = functions.https.onRequest((req, res) => {
  const ref = admin.database().ref('CustomLevels');
  ref.once('value').then(function(snapshot) {
    res.status(200).send(JSON.stringify(snapshot.val()));
  });
});

1 个答案:

答案 0 :(得分:2)

您在写入时复制数据,以获得更好的读取性能。这是一种完全合理的方法。实际上,在NoSQL数据库中保持这样的派生数据结构甚至有一个名称是非常常见的:反规范化。

要记住的一些事项:

  • 虽然云功能在比普通客户端更可预测的环境中运行,但资源仍然有限。因此,阅读大量项目以确定最新的10个项目仍然是次优的方法。对于简单操作,您希望每次写入操作都保持派生数据结构的最新。
  • 所以如果你有一个"最新的10"并且有一个新项目,您删除最旧的项目并添加新项目。使用这种方法,您需要考虑最多11个项目,而将Cloud Function查询每次写入时最新10个项目的列表,这是一个O(与n有关)操作。
  • 平均操作相同:您会发现moving average最高效,因为它不需要任何以前的数据。