Gernar
Frontend DeveloperHTTP, API и сеть

Интервью-вопрос

Что такое кэширование

Кэширование ускоряет повторное получение данных, но требует правил актуальности. Для frontend важно понимать уровни кэша, HTTP-заголовки и момент, когда старые данные становятся багом.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше коротко объяснить кэширование?

Вы отвечаете на базовый вопрос и хотите сразу показать практический смысл.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

Кэширование отвечает на простой вопрос: можно ли не делать одну и ту же работу повторно. Если пользователь уже загрузил файл, получил справочник или открыл страницу с одинаковыми данными, система может взять готовую копию из более близкого или быстрого места.

Но кэш не источник истины. Это копия. Поэтому у нее должен быть срок жизни или способ проверки свежести. Без этого ускорение легко превращается в баг. Пользователь видит старую цену, старые права, удаленный элемент или устаревший статус оплаты.

На интервью удобно ответить так:

Кэширование хранит копию результата ближе к клиенту или сервису, чтобы быстрее обслуживать повторные запросы. Но вместе с кэшем всегда нужна стратегия актуальности: TTL, ревалидация, инвалидация или версионирование. Иначе мы ускорим не правильные данные, а старые данные.

Где кэш встречается во frontend

Во frontend вы сталкиваетесь не с одним кэшем, а с несколькими уровнями. Браузер может кэшировать HTTP-ответы и статические файлы. CDN может хранить копии ассетов ближе к пользователю. Клиентское приложение может держать результаты запросов в памяти через библиотеку данных. Сервер может хранить результат тяжелого запроса в Redis.

Практический смысл в том, что каждый уровень ломается по-своему. У браузерного кэша важны заголовки. У CDN важны ключ кэша и приватность данных. У кэша запросов в UI важна инвалидация после мутаций. У storage в браузере важны срок жизни, размер, безопасность и ручная очистка.

Как выбирать политику кэша

Статические ассетыhash + max-age

CSS, JS и картинки можно хранить долго, если URL меняется при изменении содержимого. Иначе после релиза пользователь может открыть старый бандл.

СправочникиTTL + revalidate

Категории, страны и настройки часто подходят для короткого или среднего TTL. Риск ниже, но все равно нужен способ получить свежую версию.

Пользовательские данныеprivate / no-store

Профиль, права, корзина и баланс требуют осторожности. Shared-кэш или слишком долгий TTL может показать чужие или устаревшие данные.

Данные после мутацииinvalidate

После сохранения формы или удаления записи UI должен обновить связанные данные. Иначе пользователь увидит старое состояние и повторит действие.

Как выбирать стратегию

Хорошая стратегия зависит не от желания "сделать быстрее", а от цены устаревших данных. Если файл имеет хэш в имени, его можно хранить долго. Если данные меняются редко, подойдет TTL и ревалидация. Если пользователь только что изменил сущность, нужно обновить или сбросить связанные кэши.

Короткий алгоритм ответа

1Ресурс статический и меняется только при релизе?
Используйте долгий Cache-Control и имя файла с хэшем содержимого.
2Данные редко меняются, но должны проверяться на свежесть?
Добавьте короткий TTL или ревалидацию через ETag / Last-Modified.
3Данные меняются после действий пользователя?
После мутации инвалидируйте связанные запросы или обновляйте кэш вручную.
4Данные персональные или зависят от авторизации?
Не отдавайте их в shared-кэш, используйте private/no-store там, где цена ошибки высокая.

HTTP-кэш и статические файлы

Для статических ассетов типичная безопасная схема простая. Сборка добавляет хэш содержимого в имя файла, а сервер отдает долгий срок хранения.

Cache-Control: public, max-age=31536000, immutable

Это безопасно только если URL меняется при изменении файла, например app.8f3a1.js. Если отдавать долгий TTL для обычного app.js, часть пользователей после релиза может продолжать запускать старый код. Из-за этого появляются странные ошибки. Новая HTML-страница ожидает один API-контракт, а старый JavaScript работает с другим.

Для данных, которые могут измениться, часто полезна ревалидация. Сервер отдает ETag, клиент при следующем запросе отправляет условный запрос, а сервер может вернуть 304 Not Modified. Так вы экономите трафик, но все еще проверяете свежесть.

Кэш данных в приложении

Кэш запросов в UI нужен не только для скорости. Он также убирает лишние спиннеры, дедуплицирует одинаковые запросы и помогает не дергать API при каждом переходе между вкладками. Но после изменения данных его нужно синхронизировать.

Плохой пример: после сохранения профиля оставить старую копию в кэше и надеяться, что она сама обновится. Пользователь увидит прежнее имя или настройки, может повторно нажать сохранение, а аналитика получит событие успешного изменения при старом состоянии экрана.

async function saveProfile(values) {
  await api.patch("/profile", values);
  // Плохо: кэш запроса /profile остался старым.
  closeModal();
}

Безопаснее после успешной мутации обновить кэш или инвалидировать связанный запрос.

async function saveProfile(values) {
  const updatedProfile = await api.patch("/profile", values);
  queryClient.setQueryData(["profile"], updatedProfile);
  closeModal();
}

Если ответ мутации не содержит полную сущность, безопаснее инвалидировать запрос и показать состояние обновления, а не подставлять неполные данные в UI.

async function saveProfile(values) {
  await api.patch("/profile", values);
  await queryClient.invalidateQueries({ queryKey: ["profile"] });
  closeModal();
}

Если вы используете другую библиотеку или свой слой данных, идея та же. После записи UI не должен продолжать показывать старую копию как актуальную.

Главные риски

Первый риск: stale data. Он особенно заметен в корзине, правах доступа, статусах заказа, ценах и формах. Пользователь может нажать кнопку, которой уже не должно быть, отправить старое значение или увидеть неверный результат операции.

Второй риск: приватность. Ответ, который зависит от cookie, токена или роли пользователя, нельзя бездумно отдавать в общий кэш. Для таких данных нужны осторожные заголовки и понимание, где именно хранится копия.

Третий риск: лишняя память и лишние запросы. Если складывать в память все ответы без лимитов и очистки, приложение может деградировать по производительности. Если не дедуплицировать одинаковые запросы, несколько компонентов могут одновременно дергать один API и перетирать состояние ответами в разном порядке.

Как звучит сильный ответ

Сильный ответ удобно строить в три шага.

  1. Дайте определение: кэш хранит копию результата для быстрого повторного доступа.
  2. Назовите уровни: браузер, CDN, клиентское приложение, серверный кэш.
  3. Объясните цену: нужна инвалидация, ревалидация или TTL, иначе будут старые данные и баги в UI.

Пример короткого ответа:

Кэширование сохраняет копию данных или ресурсов в более быстром месте, чтобы повторный запрос не шел по полному пути. Например, браузер может кэшировать JS и CSS, CDN может отдавать картинки ближе к пользователю, а клиентское приложение может держать результаты API-запросов в памяти. Но у кэша должна быть стратегия обновления: TTL, ETag, версия файла или инвалидация после мутации. Без этого можно ускорить загрузку, но показать пользователю устаревшие или даже чужие данные.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Говорить только про ускорение

    Кэш действительно ускоряет повторные обращения, но это только половина ответа. Добавьте цену: устаревшие данные, сложная инвалидация, память и риск утечки приватной информации.
  2. 2

    Не различать уровни кэша

    localStorage, HTTP-кэш, CDN и Redis решают разные задачи. Если смешать их в ответе, будет казаться, что вы не понимаете, кто управляет сроком жизни данных и где именно может появиться stale state.
  3. 3

    Кэшировать персональные ответы как публичные

    Для данных, зависящих от пользователя, опасны shared-кэши на уровне CDN или прокси. Без корректных заголовков вроде private или no-store можно получить утечку профиля, прав или финансовых данных.
  4. 4

    Считать browser storage безопасным кэшем

    localStorage и sessionStorage не имеют нормальной серверной инвалидации и доступны JavaScript на странице. Не складывайте туда чувствительные данные как "кэш на потом". При XSS они могут утечь, а UI может долго читать старую копию.
  5. 5

    Забывать про инвалидацию после записи

    После POST, PATCH или DELETE старый кэш может остаться в UI. Без сброса или ручного обновления пользователь увидит удаленный элемент, старую цену или неверный статус операции.
  6. 6

    Ставить слишком большой TTL на изменяемые данные

    Длинный TTL хорош для версионированных ассетов, но плох для данных, которые меняются по действиям пользователя или бизнеса. Лучше выбрать короткий TTL, ревалидацию или событийную инвалидацию, чем потом чинить баги со старым состоянием.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание кэша, HTTP-заголовков и инвалидации данных.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание