Прямой ответ
Distributed caching — кеширование данных в распределенной системе для ускорения доступа (caching — «кеш в памяти» — caching — incident — «быстрый доступ к данным» — caching), зачем: снижение нагрузки на БД (caching — «меньше запросов к БД» — caching — incident — «кеш вместо БД» — caching — postgres — «разгрузка» — caching); стратегии кеширования (caching — «паттерны» — caching): (1) Cache-Aside (Lazy Loading) (caching — «приложение управляет кешем» — caching — incident — «сначала проверить кеш» — caching — redis — «приложение читает из кеша» — caching — «если нет — из БД и записать в кеш» — caching); (2) Write-Through (caching — «запись в кеш и БД синхронно» — caching — incident — «кеш всегда актуален» — caching — redis — «запись в оба» — caching — «сильная согласованность» — caching); (3) Write-Behind (Write-Back) (caching — «запись в кеш, асинхронно в БД» — caching — incident — «кеш быстро, БД потом» — caching — redis — «запись в кеш» — caching — «высокая производительность» — caching); (4) Read-Through (caching — «кеш загружает данные из БД» — caching — incident — «кеш управляет загрузкой» — caching — redis — «кеш читает из БД» — caching — «прозрачно для приложения» — caching); инструменты (caching): (1) Redis (caching — «in-memory хранилище» — caching — incident — «быстрый кеш» — caching — redis — «структуры данных» — caching — Redis — «популярный» — caching); (2) Memcached (caching — «in-memory кеш» — caching — incident — «простой кеш» — caching — redis — «key-value» — caching — Memcached — «лёгкий» — caching); паттерны (caching): (1) TTL (Time-To-Live) (caching — «время жизни данных в кеше» — caching — incident — «автоматическое удаление» — caching — redis — EXPIRE key 3600 (caching — «1 час» — caching); (2) LRU (Least Recently Used) (caching — «удаление наименее используемых» — caching — incident — «eviction policy» — caching — redis — «когда память полна» — caching); (3) Sharding (caching — «распределение данных по узлам» — caching — incident — «горизонтальное масштабирование» — caching — redis — «Redis Cluster» — caching); (4) Replication (caching — «репликация для отказоустойчивости» — caching — incident — «копии данных» — caching — redis — «Redis Sentinel» — caching); когда использовать (caching): частые чтения (caching — «много чтений» — caching — incident — «кеш вместо БД» — caching — postgres), редкие записи (caching — «мало записей» — caching — incident — «кеш актуален» — caching — redis), высокая нагрузка (caching — «БД не справляется» — caching — incident — «кеш разгружает» — caching — postgres); антипаттерны: кеш без инвалидации (caching — «данные в кеше не обновляются» — caching — incident — «устаревшие данные» — caching — redis — «инвалидация обязательна» — caching), кеш для всего (caching — «кешировать всё» — caching — incident — «память кончится» — caching — redis — «только горячие данные» — caching).
Практика: распределенное кеширование с Redis
Установка Redis (caching — kubectl apply -f redis-statefulset.yaml (caching — «Redis в Kubernetes» — caching — redis — «установка» — caching — Redis); Cache-Aside (caching — value = redis.get(key) if not value: value = db.query(key) redis.setex(key, 3600, value) return value (caching — «проверить кеш, если нет — из БД» — caching — redis — «cache-aside» — caching — incident); Write-Through (caching — redis.set(key, value) db.update(key, value) (caching — «запись в кеш и БД» — caching — redis — «write-through» — caching — incident); TTL (caching — redis.setex(key, 3600, value) (caching — «TTL 1 час» — caching — redis — «автоматическое удаление» — caching — incident); Redis Cluster (caching — redis-cli --cluster create node1:6379 node2:6379 node3:6379 (caching — «Redis Cluster» — caching — redis — «шардирование» — caching — incident).
Практический сценарий: кеширование API запросов
Контекст: API (postgres — частые запросы (incident — caching), боль: БД не справляется (caching — «высокая нагрузка» — caching — incident — «БД тормозит» — caching — postgres); решение — distributed caching: (1) Redis (caching — установка (caching — kubectl apply -f redis-statefulset.yaml (caching — redis — «Redis» — caching — Redis); (2) Cache-Aside (caching — value = redis.get(key) if not value: value = db.query(key) redis.setex(key, 3600, value) (caching — redis — «кеш вместо БД» — caching — incident); (3) TTL (caching — redis.setex(key, 3600, value) (caching — «TTL 1 час» — caching — redis — «автоматическое удаление» — caching — incident); (4) Redis Cluster (caching — шардирование (caching — redis-cli --cluster create node1:6379 node2:6379 node3:6379 (caching — redis — «горизонтальное масштабирование» — caching — incident); (5) мониторинг (метрики — метрики кеша (метрики — «hit rate» — метрики — incident — «эффективность» — метрики — redis); результат: нагрузка на БД снижена (caching — «кеш вместо БД» — caching — incident — «запросы к БД упали» — caching — postgres — «БД разгружена» — caching — «latency упала» — caching); вывод: distributed caching решили задачу (разгрузка БД — caching — ADR — «кеш без инвалидации» — антипаттерн — redis — инвалидация обязательна — caching — техдолг).
FAQ
Что такое distributed caching и какие стратегии кеширования существуют? Distributed caching (caching — кеширование в распределенной системе (caching — «кеш в памяти» — caching — incident — «быстрый доступ» — caching — redis); стратегии (caching): Cache-Aside (caching — «приложение управляет» — caching — incident — «проверить кеш» — caching — redis), Write-Through (caching — «запись в кеш и БД» — caching — incident — «сильная согласованность» — caching — redis), Write-Behind (caching — «запись в кеш, асинхронно в БД» — caching — incident — «высокая производительность» — caching — redis), Read-Through (caching — «кеш загружает из БД» — caching — incident — «прозрачно» — caching — redis); «кеш без стратегии» — антипаттерн (нужна стратегия — redis — выбор по задаче — caching — ADR — техдолг).
Какие инструменты distributed caching существуют и чем они отличаются? Redis (caching — «in-memory хранилище» — caching — incident — «быстрый кеш» — caching — redis — Redis — «популярный» — caching); Memcached (caching — «in-memory кеш» — caching — incident — «простой кеш» — caching — redis — Memcached — «лёгкий» — caching); отличие: Redis — структуры данных (caching — redis — Redis), Memcached — key-value (caching — Memcached — «выбор по задаче» — caching — incident — ADR — техдолг).
Как настроить distributed caching с Redis?
Настройка (caching — Redis (caching — kubectl apply -f redis-statefulset.yaml (caching — redis — «установка» — caching — Redis); стратегия (caching — Cache-Aside (caching — value = redis.get(key) if not value: value = db.query(key) redis.setex(key, 3600, value) (caching — redis — «cache-aside» — caching — incident); TTL (caching — redis.setex(key, 3600, value) (caching — «TTL 1 час» — caching — redis — «автоматическое удаление» — caching — incident); Cluster (caching — redis-cli --cluster create node1:6379 node2:6379 node3:6379 (caching — redis — «шардирование» — caching — incident); «кеш без инвалидации» — антипаттерн (устаревшие данные — redis — инвалидация обязательна — caching — ADR — техдолг).
Как обрабатывать инвалидацию кеша и почему это важно?
Инвалидация (caching — удаление устаревших данных (caching — «данные в кеше устарели» — caching — incident — «инвалидация» — caching — redis — «удаление» — caching); как: TTL (caching — автоматическая инвалидация (caching — redis.setex(key, 3600, value) (caching — redis — «TTL» — caching — incident), ручная (caching — при обновлении (caching — redis.delete(key) (caching — redis — «при записи» — caching — incident), события (caching — при событиях (caching — «событие → инвалидация» — caching — redis — «автоматически» — caching — incident); почему важно: без инвалидации — устаревшие данные (caching — «данные в кеше не обновляются» — caching — incident — «некорректные данные» — caching — redis — «инвалидация обязательна» — caching); «кеш без инвалидации» — антипаттерн (устаревшие данные — redis — инвалидация обязательна — caching — ADR — техдолг).
Источники: Redis docs, Memcached docs, Wikipedia (cache) — ссылки в шапке.