System Design Space
Граф знанийНастройки

Обновлено: 24 марта 2026 г. в 17:36

Стратегии кэширования: Cache-Aside, Read-Through, Write-Through, Write-Back

medium

Практический разбор основных cache-паттернов, trade-offs по latency/consistency и выбор стратегии под разные workload.

Кэширование почти всегда покупает скорость ценой рассинхронизации, инвалидации и более хрупкого операционного контура.

Глава сравнивает Cache-Aside, Read-Through, Write-Through и Write-Back через read-after-write semantics, cache miss behavior, stampede protection, recovery after failure и стоимость поддержки source of truth в нескольких слоях.

В архитектурных разговорах это помогает обсуждать cache placement, staleness tolerance и failure modes кэш-слоя как реальные design decisions, а не как автоматическое "давайте поставим Redis".

Практическая польза главы

Кэш как контракт

Проектируйте cache policy как часть продуктового контракта: что можно отдавать stale и где нужна строго свежая информация.

Инвалидация

Выбирайте схему инвалидации под бизнес-семантику: write-through, event-based, TTL или гибрид с версионированием.

Анти-шторм

Добавляйте защиту от stampede: jitter TTL, single-flight, background refresh и ограничение fan-out к origin.

Interview confidence

Демонстрируйте, что понимаете не только ускорение чтения, но и влияние кэша на консистентность и операционные риски.

Pattern

Cache-Aside Pattern

Классическое описание паттерна кэширования с практическими компромиссами.

Открыть материал

Выбор стратегии кэширования определяет не только latency, но и границы консистентности, сложность recovery и поведение системы во время пиков. В продакшене обычно комбинируют несколько подходов: например, cache-aside для read-path и write-through для критичных сущностей с read-after-write требованиями.

Четыре базовые стратегии

Cache-Aside

Приложение само управляет чтением из cache и загрузкой из DB при miss.

Read Path

App

read(key)

Cache

GET key

DB

SELECT on miss

Cache

SET key

App

return value

Write Path

App

update(key)

DB

WRITE source of truth

Cache

invalidate/update key

App

ack

Что происходит

  • Чтение сначала идет в cache; при miss значение загружается из DB.
  • После miss приложение само прогревает cache для следующих запросов.
  • Запись сначала в DB, затем invalidate/update cache для контроля stale-данных.

Риск: Критично не забывать invalidation, иначе растет stale-read rate.

Быстрый выбор стратегии

StrategyRead latencyWrite latencyConsistencyComplexityBest fit
Cache-AsideНизкая на hit, выше на missНизкая (DB-only + invalidate)Eventual (зависит от invalidation)Низкая/средняяGeneral-purpose read-heavy сервисы
Read-ThroughСтабильная через единый cache layerЗависит от пары с write-policyЗависит от write-side стратегииСредняяПлатформенные cache-слои
Write-ThroughНизкаяВыше (синхронная двойная запись)Высокая после успешной записиСредняя/высокаяRead-after-write критичен
Write-BackНизкаяОчень низкаяEventual, сложный recoveryВысокаяWrite-heavy ingestion

Практические правила

Что делать

  • Фиксируйте SLA по staleness до выбора стратегии.
  • Отдельно проектируйте cache invalidation и eviction policy.
  • Для write-back используйте durable buffer + idempotent flush.
  • Добавляйте protection от cache stampede (single-flight, jitter TTL).

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

  • Кэшировать без явной стратегии invalidation и TTL.
  • Использовать write-back для критичных финансовых данных без durable queue/journal.
  • Кэшировать все подряд вместо focus на hot keys и дорогие запросы.
  • Не учитывать stampede/thundering herd на массовом cache miss.
  • Не считать hit rate, p95/p99 latency и stale-read rate.

Мини-чеклист по внедрению

1. Измерьте базовый p95/p99 и hit rate до внедрения.
2. Определите source of truth и политику invalidation.
3. Ограничьте размер ключа и продумайте namespace/versioning.
4. Добавьте fallback-поведение на cache outage/degradation.

Короткое правило выбора: если важнее предсказуемость и простота - начинайте с Cache-Aside; если критичен строгий read-after-write - смотрите в сторону Write-Through; если критичен write throughput и допустим eventual consistency - используйте Write-Back с надежным flush-контуром.

Стратегия кэширования должна определяться бизнес-SLA, а не привычкой команды.

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки