Учебник веб-разработки
Разделы учебника
На этой странице

VIII. Системы хранения

Redis: структуры данных и роль кеша

Оглавление · Ключи и уровни кеша · Модели хранения

Задача: объяснить, что даёт Redis и какие обязательства остаются у приложения. Нужны ключи, TTL, промах и источник истины. Redis в Atmanki не подключён.

Это не замена SQL по умолчанию

Redis предоставляет структуры по ключам: строки, hashes, списки, sets, sorted sets и streams. Конкретная структура определяет операции: set membership и ранжирование по score — разные запросы. Типы Redis.

Учебные роли: кеш публичного чтения, ограничение частоты, временное состояние, ранжирование. Каждая требует своего контракта. Наличие streams не создаёт автоматически процесс фоновой обработки; у проекта сейчас нет таких задач.

Если PostgreSQL хранит редакторский контент, Redis-копия не получает автоматически уникальность slug, связи, публикацию и транзакции CMS. Сначала задайте источник истины и допустимую потерю данных, затем роль дополнительного сервиса.

Cache-aside

Исходник схемы
flowchart TD
  Request["Чтение публичной статьи"] --> Cache{"Пригодная копия в Redis?"}
  Cache -->|Да| Hit["Вернуть копию"]
  Cache -->|Нет| Source["Прочитать источник"]
  Source --> Validate["Проверить и сформировать публичный результат"]
  Validate --> Store["Сохранить копию с TTL"]
  Store --> Return["Вернуть результат"]

Это проектируемая модель. В Atmanki эту роль выполняют кеши Next, не Redis. Добавлять ещё один слой имеет смысл после измерения и определения правил инвалидирования; иначе диагностика свежести станет сложнее.

Ключ должен включать существенные измерения: версия формата, идентификатор, язык и область доступа. Публичные и персональные данные нельзя смешивать. TTL ограничивает переиспользование, но не гарантирует мгновенную свежесть после записи.

Команды и границы

Иллюстрация для отдельного учебного Redis, не команда для серверов проекта:

SET lesson:article:first "Учебная копия" EX 60
GET lesson:article:first
DEL lesson:article:first
GET lesson:article:first

SET с EX задаёт значение и срок одной командой. Раздельные SET и EXPIRE оставляют окно сбоя между ними. SET. После DEL GET не находит значение. Этот короткий сценарий не проверен на запущенном Redis и не моделирует конкурентные async-чтения.

Старое чтение может завершиться после инвалидирования и вернуть устаревшую копию в кеш. Массовый miss может нагрузить источник. Смягчение требует политики версий, слияния работы или ограничений, а не одного DEL. Простой lock тоже требует анализа срока владения, отказов и безопасного освобождения.

Недоступность, память и устойчивость

Для необязательного кеша можно читать источник при отказе Redis, но поток промахов способен перегрузить его. Ограничьте работу и наблюдайте hit rate, задержки, ошибки и вытеснение. Для лимитера или сессий режим отказа имеет другой смысл: общий «fallback на БД» не заменяет проектирование.

Redis может сохранять данные через RDB-снимки и AOF-журнал. Гарантии потери при сбое зависят от выбранной политики; хранение в памяти не означает отсутствие persistence. Persistence. Репликация не является резервной копией от ошибочного удаления.

TTL и вытеснение памяти — разные механизмы. Если запись исчезла раньше ожидаемого из-за лимита памяти, приложение должно понимать, допустимо ли восстановление из источника. История ключей идемпотентности требует иных гарантий, чем необязательная копия статьи: потеря истории может разрешить повторный эффект.

Практика

Нарисуйте чтение при hit, miss, отказе Redis и отказе источника. Для каждого укажите ответ пользователю и предел нагрузки. Затем разберите гонку: старое чтение → изменение источника → DEL → завершение старого чтения.

Сравните требования к кешу статьи и журналу обработанных операций. Объясните, почему выбор EX 60 не доказывает безопасный повтор записи после рестарта. Практическое подключение клиента Redis и проверка отказов остаются отдельной лабораторией; production-зависимость ради этой главы не добавляется.