System Design Space

    Глава 15

    Обновлено: 15 февраля 2026 г. в 07:48

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

    Прогресс части0/8

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

    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, а не привычкой команды.