Я создаю API-интерфейс блога, используя Nodejs, и мои данные поступают из службы очистки, которая собирает данные с множества новостных веб-сайтов, поэтому базы данных нет.
Службе очистки требуется около 30 секунд, чтобы вернуть ответ для страницы 1 всех сайтов, с которыми я выполняю очистку. (Представьте себе, как будет выглядеть разбиение на страницы в моем приложении :()
Если вы не знаете, что такое scaping, вы просто думаете о нем как о нескольких API и я получаю данные от каждого из них, затем объединяю все в один массив результатов.
Так что из-за длительного времени ответа я начинаю использовать пакет node-cache
для кэширования, и он сохраняет мой запрос время от 30 секунд до 6 миллисекунд (Wooow, верно?)
Проблема в том, что когда мой кэш истекает через x раз, мне нужно ждать, пока случайный пользователь снова не достигнет моей конечной точки, чтобы восстановить кеш снова с новыми данными, и он будет ждать целых 30 секунд, пока не получит ответ.
Мне нужно избегать этого столько, сколько я мог, поэтому любые идеи? Я искал? много и не получая никаких полезных результатов !!, все статьи рассказывают о том, как кэшировать, а не техники.
# обновление
Я нашел своего рода решение для пакета, который я использую для кеширования предусмотрены в их API Docum Ввод события с именем cache.on('expired', cb)
означает, что я могу прослушать любой срок действия кэша.
То, что я сделал, - это бесконечное l oop, когда я обращаюсь к себе каждый раз, когда срок действия кэша истекает
Код
class MyScraperService {
constructor() {
this.cache = new NodeCache({ stdTTL: 30, checkperiod: 5, useClones: false });
this.cache.on('expired', (key: string, data: Article[]) => {
console.log('key: ', key);
// send a request to get all my articless again and again once the cahce get expires
this.articles( key.charAt( key.length -1 ) ); // page number
});
}
async articles(page: string): Promise<Article[]> {
// nodeCache()
if (this.cache.get(`articles_page_${page}`)) {
let all: Article[] = this.cache.get(`articles_page_${page}`); //.sort(() => Math.random() - 0.5);
return all.sort(() => Math.random() - 0.5);
}
let artilces: any = await Promise.all([
this.xxScraper(page),
this.xxScraper(page),
this.xxScraper(page),
this.xxScraper(page),
this.xxScraper(page),
this.xxScraper(page),
this.xxScraper(page),
this.xxScraper(page),
this.xxScraper(page),
this.xxScraper(page)
]);
let all: Article[] = [];
for (let i = 0; i < artilces.length; i++) {
const article = artilces[i];
all.push(...article);
}
this.cache.set(`articles_page_${page}`, all);
all = all.sort(() => Math.random() - 0.5);
return all;
}
}