【问题标题】:Query sqlite every 10s vs using timeout vs node-cron每 10 秒查询一次 sqlite vs 使用超时 vs node-cron
【发布时间】:2017-04-01 04:09:06
【问题描述】:

我有一个包含一个表的 sqlite 风味数据库,它有大约 10k 个项目和 5 列。在其中一列中,我有一个“计时器”,基本上是我给出的一个数字,它的目的是随着时间(理想情况下是每秒)的流逝而减少它,直到它达到零。当它达到零时,我想执行一个动作。

思考过程

1st:我可以每 10 秒(setInternal)为每个需要的项目(可能是 10k 中的 2k)更新我的数据库 - 为了不强调它 - 并检查是否有任何项目达到零.我不太愿意这种方式,因为我觉得它可能效率不高。

第二次: 因为我在 nodejs 上,所以我可以使用超时。读一次我的数据库得到所有想要的用户,并为每个用户创建一个 setTimeout 方法。大约一分钟后更新数据库,nested-setInternal 由于每个 setTimeout 占用大约 35 字节的 nodejs 堆,因此它不是一个坏方法。 -现在我认为这是该去的地方了。

3rd:我发现了这个https://github.com/kelektiv/node-cron github,它基本上是一个任务调度器。看了一会儿它的代码,我不认为它不好,但我真的不认为我必须在这里使用外部包。

注意:如果我在进程崩溃的情况下使用上述任何方法,它们将被重置(完全失去意义)而不定期更新我的数据库,所以我想我无法避免这种情况。

问题:我应该怎么做才能在我的数据库中每隔几秒有效地更新一个计时器(所以我的进程一直处于活动状态)而不耗尽我的资源?

对于那些阅读整本书并觉得自己浪费时间的人感到抱歉。

【问题讨论】:

    标签: javascript node.js sqlite settimeout


    【解决方案1】:

    不要将剩余时间存储在数据库中。而是存储操作的绝对时间戳。

    然后您可以简单地询问需要处理的任何操作:

    SELECT *
    FROM actions
    WHERE timestamp > (last handled timestamp)
      AND timestamp <= (current timestamp);
    

    (如果timestamp列被索引,这个查询效率很高。)

    您还可以获取到下一个事件的时间,以编程超时:

    SELECT timestamp
    FROM actions
    WHERE timestamp > (last handled timestamp)
    ORDER BY timestamp ASC
    LIMIT 1;
    

    【讨论】:

    • 抱歉回复晚了,我睡着了,谢谢,这似乎是一个不错的方法。
    【解决方案2】:

    流程可以如下

    1. 在启动服务器时,将调用一种方法,该方法将检查表中的计时器字段,如果发现任何记录为零,它将只执行您的操作。 (在操作中使用 Promise)。
    2. 当 promise 结束时调用另一个函数并在该函数中等待几秒钟,然后再次调用前一个函数。

    您可以使用具有一定时间延迟的递归函数调用。这种延迟只是为了减少数据库负载或死锁。

    【讨论】:

    • 所以你建议类似:call_DB->更新数据库中的计时器->如果为零-操作否则 setTimeout (1s)->再次调用。基本上我说的第一种方法对吗?
    • 我只创建一个函数说“checkTimer”,如果计时器从这个函数调用“updateDbFunction”发现为零,否则 settimeout(10s)->再次调用“checkTimer”。在 updateDbFunction 处理您的操作 THEN settimeout(10s)->再次调用“checkTimer”
    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2012-03-26
    • 2019-06-06
    相关资源
    最近更新 更多