当前位置: 首页 > 知识库问答 >
问题:

防止实时流触发多个findOne调用

严昀
2023-03-14

我有一个大致如下的事件流:

{ hash: 'XXXX', foo: 'bar }

在每次命中时,我都要使用mongoose在数据库中查找哈希

await Model.find({hash: XXX})

有时,我会遇到一堆共享相同哈希的事件,当前它会触发一堆.find()调用,这些调用基本上返回相同的内容。

如果哈希相同,我如何优化此过程并防止.find()被多次调用。

共有1个答案

简培
2023-03-14

你有很多方法可以做到这一点。如果列表不长,则使用DB结果保留这些对象的数组。在执行DB查询之前搜索数组。

// Disclaimer: This is total pseudocode - not tested in REPL or anything :)
//
// hashResults as an array of objects like:
// { hash: XXX, data: obj }

let hashResults = [];

const getHashValue = async (hash) => {
  const result = hashResults.find(r => r.hash === hash)
  if (result) {
    return result.data;
  } else {
    // Do the DB lookup
    const data = await Model.find({ hash });

    // add to the cache of results
    hashResults.push({ hash, data });

    return data;
  }
}

// However you are looping for the hashes... assuming you have an array of them.
for(h in hashes) {
  const val = await getHashValue(h);
}
 类似资料:
  • 问题内容: 我有一个ajax电话 现在,这里是10分钟后收到的答复。因此,ajax调用被多次调用。为什么会发生这种情况/我们如何确保ajax调用仅被调用一次? 问题答案: 禁用按钮的另一种方法是使用.one()方法,并在回调后重新绑定事件处理程序:

  • 是否存在防止DynamoDB流在每次DynamoDB更改时触发λ的方法? 这些数字并不准确,但是假设step函数将连续运行10次,那么它将更新DynamoDB 3次。在step函数触发lambda之前,这是调用lambda的30倍。有什么方法可以阻止这些lambda调用吗?

  • 问题内容: 在Linux平台上,用于进程(C ++应用程序)检查其实例尚未运行的最佳方法是什么? 问题答案: 执行此操作的标准方法是在某个地方创建一个pidfile,通常包含程序的pid。 您无需将pid放在其中,只需在其上放置排他锁即可。如果您打开它进行读/写并使用LOCK_EX LOCK_NB,如果文件已被锁定,它将失败。这是无竞争条件的,如果程序崩溃,该锁将自动释放。 通常,您希望按用户进行

  • 问题内容: 如果我有标记: .a类具有与之关联的悬停类 .b类具有与之关联的伪元素…像这样: CSS是否有可能防止伪元素触发.a类悬停? 小提琴 问题答案: 以下CSS为现代浏览器(而非IE10-)提供了诀窍: 允许元素不接收悬停/点击事件。 警告 对非SVG元素的支持处于相对早期的状态。developer.mozilla.org给您以下警告: 在CSS中将指针事件用于非SVG元素是实验性的。 该

  • 我正在运行一个spark作业,流上下文每60秒运行一次。问题是一批处理时间太长(由于计算和保存RDD和Parquet到云存储),一批无法在1分钟内完成。它结束于下一批继续进入并成为活动的(状态=处理)。过了一段时间,我有10个活动批处理,而第一个已经完成。结果,它明显减慢,没有一批能够完成。是否存在严格限制一次活动批处理的数量为1。 多谢了。

  • 我只需要在更新容器中的所有4行时运行函数。我还没有在网上找到任何关于这是否可能的信息。如果你能告诉我这是否可能,如果可能的话,怎么做,那就太好了。