StudyCode
Слои по пути запроса: браузерный кэш (Cache-Control, ETag — повторный визит вообще не ходит в сеть), CDN (статика на edge-серверах рядом с пользователем), кэш приложения (Redis или память процесса — результаты тяжёлых запросов), кэш БД (буферы, кэш планов). Инвалидация — знаменитая «одна из двух сложных проблем CS»; стратегии: TTL — данные протухают сами (просто, но окно устаревания); явная инвалидация — при изменении данных удаляем ключ (точно, но нужно не забыть все места записи); версионирование ключей — имя файла с хешем (app.3f2a.js) кешируется вечно, обновление — это новый ключ. Начинайте с коротких TTL: устаревание на 60 секунд почти всегда приемлемо, а класс багов «забыли инвалидировать» исчезает.
// Cache-aside с явной инвалидацией
async function getProduct(id) {
const cached = await redis.get(`product:${id}`);
if (cached) return JSON.parse(cached);
const product = await db.products.findById(id);
await redis.set(`product:${id}`, JSON.stringify(product), {
EX: 60, // TTL — страховка, если инвалидацию забудут
});
return product;
}
async function updateProduct(id, data) {
const product = await db.products.update(id, data);
await redis.del(`product:${id}`); // явная инвалидация
return product;
}