Обычно кеширование работает так:
function получитьДанные() {
if (данныеЕстьВкеше() && данныеНеПротухли() ) {
return данныеИзКеша();
} else {
var данные = сгенеритьДанныеДолгоИнудно()
сохранитьВкеш(данные);
return данные;
}
}
Если данные долго генерятся - юзер ждет пока не пересчитаются.
Я наговнокодил свой велосипед, который хорошо работает:
function получитьДанные() {
if (данныеЕстьВкеше() && данныеНеПротухли() ) {
return данныеИзКеша();
} elseif(данныеЕстьВкешеНоУжеПротухли() ) {
App::on('finish', function() { // после отдачи результата обновляем данные в кеше
var данные = сгенеритьДанныеДолгоИнудно();
сохранитьВкеш(данные);
});
return данныеИзКеша(); // возвращаем пусть и протухшие, зато не ждем
} else {
// данных в кеше никаких нет, придется перегенерить в любом случае
var данные = сгенеритьДанныеДолгоИнудно();
сохранитьВкеш(данные);
return данные;
}
}
// в коде еще есть проверки не перегенеряем ли мы уже данные
// (чтобы одновременно в другом потоке не перегенерять их несколько раз)
// но для упрощения понимания алгоритма убрал их из псевдокода.
Вопрос: такой способ кеширования и обновления кеша имеет какое то правильное название? Я
вроде где то встречал на стековерфлоу название, но сейчас не могу найти.