Этот вопрос проверяет понимание основных стратегий кеширования и знание типичных инструментов (Redis, in-memory, HTTP-кеш, CDN).
Кеширование — это сохранение уже вычисленных или полученных данных, чтобы не обращаться каждый раз к “дорогому” источнику (БД, внешнему API, тяжёлым расчётам).
Используются разные подходы: кеширование в памяти приложения, кеширование в Redis/Memcached, HTTP-кеширование, кеширование на уровне БД и CDN для статики.
Инструменты: Redis, Memcached, встроенные фреймворковые кеши (Django cache, Flask-caching), reverse-proxy (Nginx), CDN.
Кеширование ускоряет приложение и снижает нагрузку на базу и внешние сервисы, но требует аккуратной стратегии инвалидции (“invalidation”).
Кеширование — один из ключевых способов оптимизации производительности. Идея проста: если результат операции меняется редко, его можно сохранить и переиспользовать, вместо того чтобы каждый раз считать заново.
Кеширование в памяти приложения (in-memory cache).
Кеширование во внешнем хранилище (Redis, Memcached).
HTTP-кеширование (заголовки Cache-Control, ETag).
Кеширование на уровне БД (materialized views, кеширование запросов).
Кеширование на уровне инфраструктуры (CDN, reverse proxy).
Используется, когда:
один экземпляр приложения;
данных не очень много;
не критично, если кеш потеряется при рестарте.
Пример на Python — LRU-кеш через functools.lru_cache:
python
from functools import lru_cache
@lru_cache(maxsize=1024)
def get_user(user_id):
# дорогой запрос в БД
...
Плюсы:
очень быстро;
Минусы:
не шарится между несколькими инстансами.
Используются как внешний кеш-сервис.
Подходят для микросервисов и множества инстансов приложения.
Пример использования Redis в Python:
python
import redis
import json
r = redis.Redis(host="redis", port=6379)
def get_user_cached(user_id):
key = f"user:{user_id}"
data = r.get(key)
if data:
return json.loads(data)
user = load_user_from_db(user_id)
r.setex(key, 60, json.dumps(user)) # TTL 60 секунд
return user
Работает на уровне протокола HTTP.
Используются заголовки:
Cache-Control
ETag
Last-Modified
Пример (FastAPI / Flask / Django) — выставление заголовков, чтобы браузер или прокси мог кэшировать ответ.
Примеры:
материализованные представления (materialized views);
сохраняемые результаты тяжёлых запросов;
Query cache (в некоторых СУБД и ORM).
CDN (Cloudflare, Akamai, AWS CloudFront) кеширует статику: картинки, js, css.
Reverse прокси (Nginx, Varnish) может кэшировать HTTP-ответы приложений.
Cache-aside (lazy loading): приложение сначала смотрит в кеш, если нет — идёт в источник, кладёт в кеш.
Write-through: при записи сразу обновляется кеш.
Write-back: сначала пишем в кеш, потом асинхронно в БД.
Сложная часть кеширования — когда и как очищать кеш:
по TTL (время жизни ключа);
при изменении исходных данных (явное удаление ключей);
через версии ключей (добавляем версию к ключу).
Кеширование — мощный инструмент для ускорения приложений и снижения нагрузки. На практике чаще всего используют Redis/Memcached плюс in-memory кеш, а также HTTP- и CDN-кеширование для статики и публичных API.