我有一个包含一张表的 sqlite 风格数据库,它有大约 10k 个项目,有 5 列。在其中一列中,我有一个“计时器”,基本上是我给出的一个数字,它的目的是随着时间(最好是每秒)的推移而减少它,直到它达到零。当它达到零时,我想执行一个操作。
思考过程
第一:我可以每 10 秒(setInternal)为每个需要的项目(可能是 10k 中的 2k)更新我的数据库 - 为了不强调它 - 并检查是否有任何项目达到零。我不情愿采用这种方式,因为我觉得它可能效率不高。
第二:由于我在 nodejs 上,我可以使用超时。读取一次我的数据库获取所有想要的用户,并为每个用户创建一个 setTimeout 方法。大约一分钟后更新数据库,nested-setInternal 由于每个 setTimeout 占用约 35 字节的 nodejs 堆,因此这是一个不错的方法。-现在我认为这是要走的路。
第三:我发现了这个https://github.com/kelektiv/node-cron github,它基本上是一个任务调度程序。在查看了它的代码之后,我不认为它很糟糕,但我真的不认为我必须在这里使用外部包。
注意:无论我使用上述哪种方法,以防进程崩溃,它们都会被重置(完全失去意义)而无需定期更新我的数据库,所以我想我无法避免这种情况。
问题:我应该怎么做才能每隔几秒有效地更新我的数据库中的计时器 -(所以我的进程一直处于活动状态) - 而不会耗尽我的资源?
对那些阅读整篇文章并觉得他们失去了时间的人感到抱歉。
不要将剩余时间存储在数据库中。而是存储操作的绝对时间戳。
然后,您可以简单地询问需要处理的任何操作:
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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句