EMZETT.
Войти

Кэши

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

Подробнее: Кэши существуют на многих уровнях — в браузере (HTML/CSS/JS/изображения), на DNS-резолверах (ответы до истечения TTL), в CDN или в подключении приложения к базе данных. Цель всегда одна: реже обращаться к более медленным первоисточникам (сеть, база данных).

Подробности

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

  • Кэш браузера: хранит статические ресурсы (изображения, CSS, JS) локально на устройстве пользователя — самый быстрый слой, но отдельный для каждого устройства.
  • Кэш CDN: глобально распределённая сеть серверов, держащая содержимое географически близко к пользователю — например, edge-сеть Vercel автоматически кэширует статические страницы Emzett.
  • Кэш DNS: резолверы запоминают ответы до истечения TTL, чтобы не проходить всю цепочку DNS заново при каждом запросе.
  • Кэш приложения/базы данных: например, кэши Redis для дорогих запросов к базе данных.

Каждый из этих кэшей может выдавать устаревшие («stale») данные, если первоисточник меняется до обновления кэша, — поэтому фундаментальная проблема кэширования не в самом кэшировании, а в своевременной и правильной инвалидации. Для этого есть две базовые стратегии: истечение по времени (кэш автоматически отбрасывает запись после фиксированного TTL, независимо от того, изменились ли данные на самом деле) и явная инвалидация (приложение активно сообщает кэшу «эта запись теперь недействительна», например сразу после обновления базы данных).

Согласованность кэша как настоящая проблема

При нескольких слоях кэша одновременно (браузер, CDN, приложение) один и тот же запрос может давать ответы разной актуальности в зависимости от слоя — пользователь, например, всё ещё видит в кэше браузера старую цену товара, а CDN уже давно отдаёт новую. Именно это регулируют заголовки HTTP, такие как Cache-Control и ETag:

Cache-Control: max-age=3600, must-revalidate
ETag: "a1b2c3d4"

max-age указывает, как долго клиент может использовать ответ без нового запроса; must-revalidate затем принуждает к проверке на сервере (вместо того чтобы просто продолжать использовать устаревшую версию); ETag — отпечаток содержимого, позволяющий серверу при такой проверке эффективно выяснить, изменилось ли что-то на самом деле, не передавая заново весь ответ (ответ 304 Not Modified, если нет).

Областью, которую в Emzett намеренно НЕ кэшируют, является, например, состояние корзины — здесь даже кэш со временем жизни в несколько секунд был бы реальным риском показать неверные остатки.

См. также: Кэширование (caching), TTL