2017-03-31 19 views
0

我有一个sqlite的味道DB包含一个表,它拥有约10,000项与5列。在其中的一列中,我有一个“计时器”,基本上是我给出的一个数字,其目的是随着时间的推移(理想情况下每秒)降低到零。当它达到零时,我想执行一个动作。查询sqlite的每10s VS使用超时VS节点的cron

思维过程

1:我可以更新我的需要(可能为2K出10K的)每10s(setInternal)每个项目DB - 作为不强调IT和检查是否任何项目都达到零。我对这种方式很不情愿,因为我觉得它可能效率不高。

2nd:由于我在nodejs上,我可以使用超时。只读一次我的数据库获取所有想要的用户,并为他们每个人创建一个setTimeout方法。一分钟左右更新数据库后,nested-setInternal由于每个setTimeout占用大约35bytes的nodejs堆,所以它不是一个坏方法。 - 现在我认为这是要走的地方。

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

注:不管上面的方法,我在的情况下使用过程中坠毁,他们将被重置了(完全失去了点),而无需更新我的DB周期性,所以我想我不能避免这种情况。

问题:我应该怎么做才能有效地更新我的数据库中的定时器每隔几秒钟(所有的时间我的进程是活着的) - 没有耗尽我的资源?

对不起那些读了整个事情,觉得他们失去了他们的时间。

回答

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; 
+0

对不起,我晚睡了,谢谢你,这似乎是一个很好的方式。 – nonerth

0

流量可如下

  1. 在启动服务器的一个方法被调用,这将检查计时器字段表一旦发现零它只会执行您的操作的任何记录。 (使用诺言)。
  2. 当承诺克服呼吁一些第二另一功能,在功能等待,然后再次调用以前的功能。

可以使用递归函数与一些时间延迟调用。此延迟仅用于减少数据库负载或死锁。

+0

所以你认为是这样的:call_DB->在DB-更新计时器>如果零 - 行动别的的setTimeout(1S ) - >再次打电话。基本上我说的第一种方法是对的? – nonerth

+0

我只是创建一个函数说:“checkTimer”,如果定时器发现零从这个函数调用“updateDbFunction”else settimeout(10s) - >再次调用“checkTimer”。 IN updateDbFunction处理你的操作THEN settimeout(10s) - >再次调用“checkTimer” –