Разделять паттерны просто на «чтение» и «запись» — частая ошибка, которая вносит путаницу. Гораздо проще понять их, если задать один архитектурный вопрос: Кто отвечает за синхронизацию с базой данных — само приложение или кеш?
Подход 1: Приложение-оркестратор
Здесь кеш и база данных ничего не знают друг о друге. Приложение выступает дирижером: оно само ходит в БД и само решает, когда обновить кеш. К этому подходу относятся два паттерна:
1. Cache-Aside (Паттерн для чтения и обновления)
Приложение ищет данные в кеше. Если их нет (miss), оно идет в базу, забирает данные и самостоятельно кладет их в кеш. При обновлении данных (UPDATE) приложение пишет в БД, а затем удаляет устаревшую запись из кеша.
- Плюсы: В кеше лежат только нужные данные. Кеш упал — приложение просто пойдет в БД.
- Минусы: Приходится писать много логики (бойлерплейта) в коде приложения.
2. Write-Around (Паттерн для записи)
Приложение пишет данные сразу в БД, полностью игнорируя кеш. Кеш заполнится сам только тогда, когда эти данные кто-то запросит (сработает Cache-Aside).
- Где применяется: Запись логов или аналитики — данные пишутся, но почти никогда не читаются сразу.
Подход 2: Кеш как невидимая прослойка
В этом подходе приложение общается только с кешем, воспринимая его как основную БД. А уже сам кеш (или специальная прокси-библиотека под ним) берет на себя ответственность за синхронизацию с реальной базой. Здесь живут следующие паттерны:
1. Read-Through (Паттерн чтения)
Приложение просит данные у кеша. Если случается miss, кеш сам идет в БД, забирает данные, сохраняет у себя и отдает приложению.
- Плюсы: Код приложения становится кристально чистым.
2. Write-Through (Надежная запись)
Приложение пишет в кеш. Кеш синхронно (в рамках одной транзакции) пишет в базу, и только потом отвечает приложению «ОК».
- Плюсы: Строгая согласованность данных (идеально для биллинга).
- Минусы: Медленная запись (два последовательных I/O прыжка).
3. Write-Back / Write-Behind (Быстрая запись)
Приложение пишет в кеш, и кеш мгновенно отвечает «ОК». А затем асинхронно, в фоновом режиме (например, пачками раз в секунду) сбрасывает накопленные изменения в БД.
- Плюсы: Феноменальная пропускная способность. БД спасена от шквала мелких записей.
- Минусы: Если сервер кеша обесточить до сброса данных в БД — данные будут потеряны навсегда.
Итоговый чек-лист
| Паттерн Чтения | Паттерн Записи | Идеальный юзкейс |
|---|---|---|
| Cache-Aside | Write-Around | SaaS-CRM, блоги (много чтений, редкие правки) |
| Read-Through | Write-Through | Банки, биллинг (строгая консистентность важнее скорости) |
| Read-Through | Write-Back | Счетчик лайков, лента Twitter/TikTok (максимальная скорость, потеря лайка не критична) |