Read-Through

Базовый System Design
≈ 2 мин чтения

Приложение видит только кэш

В Read-Through приложение не пишет отдельную логику «miss → база → put». Оно запрашивает значение у кэша, а сам кэш знает, как загрузить отсутствующие данные из основного источника.

application
    |
    v
  cache ---- hit ----> value
    |
   miss
    v
cache loader
    |
    v
primary source

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

Логика загрузки становится централизованной

Главное отличие от Cache-Aside — место ответственности. В Cache-Aside путь промаха реализует приложение, а в Read-Through он находится внутри кэширующего слоя или библиотеки, которая предоставляет такой интерфейс.

Это удобно, когда много участков кода читают данные одинаковым способом: правила построения ключа и загрузки можно держать в одном месте.

Цена абстракции

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

Кроме того, miss всё равно требует обращения к основному хранилищу. Read-Through упрощает код и распределение ответственности, но не отменяет стоимость первого чтения.

Cache-Aside и Read-Through решают похожую задачу разным размещением логики. Выбор зависит не от «скорости паттерна», а от того, где удобнее и безопаснее держать правила загрузки данных.