3

我使用 MySQL 存储数据并每隔几分钟向 URL 发送请求。

URLs 表被查询一次,并且通过每分钟使用 setInterval() 运行 sendRequest 函数来重新发送每个请求。

问题是,如果从数据库中删除 URL,它仍然会继续发送请求,因为我没有在每个请求之前查询数据库(并且我的函数不知道记录已被删除)。

而且,我不想在每个请求之前查询相关的数据库记录,因为那是一种矫枉过正(有很多记录)。

因此,我愿意每分钟查询一次数据库以查找所有已删除的记录并清除已删除的记录。这样我就不需要每分钟查询每条记录,而只需每分钟查询一次更新记录(如果我有一百万个 URL,这将导致每分钟 1 个查询,而不是每分钟 100 万个查询)。

但是,假设我的查询告诉我数据库记录 1,3 和 6 被删除,我怎样才能只清除它们?

4

3 回答 3

1

您可以将链接到记录 ID 的超时 ID 存储在对象中:

var recordIntervals = {};

recordIntervals[recordId] = setInterval(queryRecordId, time);

However that's probably not a good idea. What I'd do it keep only one interval running every minute, query the database and then send the requests to whatever URLs the database gives me.

setInterval(function () {
  var urls = db.query('SELECT * from URLs');
  urls.forEach(function (url) {
    sendRequest(url);
  });
}, oneMinute);
于 2013-01-14T16:05:46.710 回答
1

Seems like I solved it this way:

Defined the setInterval (with var names like url6, url5..) as

global['url' + urlID] = setInterval.....

And, with an updated records query each minute, called clearInterval for the defined records:

clearInterval(global['url' + urlID]);

While asking the question, I was actually looking for a schema like both @juandopazo and @George suggested and accepting the answer of @juandopazo as it was the 1st answer. Thanks so so much.

于 2013-01-14T16:21:34.950 回答
0

您可以使用 2 个数组(或带有 2 个数组的 json 数组):一个用于存储 url,一个用于存储间隔

示例 1

nrRequests = 1;
urls[nrRequests] = url;
requests[nrRequests] = setInterval(function(){},1000);
nrRequests++;

示例 2

var requests = [];
var interval = setInterval...
var url = get url..
requests.push({
   interval : interval,
   url: url
});

///deleted url: 搜索 urls 并找到索引,然后清除为 requests[nrRequests] 设置的间隔

for(var item in requests)
{
    if(requests[item][url]==deletedurl)
    {
        clearInterval(requests[item][interval]);
        delete requests[item];
    }
}
于 2013-01-14T15:59:47.790 回答