Проверяет знание стратегий инвалидации кэша и практический опыт их применения в реальных проектах.
Кэширование ускоряет чтение данных, но создаёт проблему согласованности: данные в кэше могут устареть, если источник (база данных) изменился. Инвалидация кэша — это механизм, который гарантирует, что клиент получает актуальные данные, удаляя или обновляя устаревшие записи. Без неё пользователи видят старые значения, что критично для финансовых систем, корзин интернет-магазинов и любых приложений с частыми обновлениями.
// Чтение с cache-aside и TTL
const getProduct = async (id) => {
const cached = await redis.get(`product:${id}`);
if (cached) return JSON.parse(cached);
const product = await db.findProduct(id);
await redis.set(`product:${id}`, JSON.stringify(product), 'EX', 3600);
return product;
};
// Инвалидация по событию при обновлении
const updateProduct = async (id, data) => {
await db.updateProduct(id, data);
await redis.del(`product:${id}`); // удаляем устаревший ключ
};В этом примере TTL защищает от «вечного» устаревания, а явное удаление при обновлении гарантирует мгновенную актуальность для часто меняющихся данных.
На практике комбинируют TTL для редко меняющихся данных и инвалидацию по событию для критичных обновлений. Выбор стратегии зависит от требований к согласованности и допустимой нагрузки на БД. Для большинства веб-приложений cache-aside с TTL и точечной инвалидацией — оптимальный баланс простоты и эффективности.