Содержание

Redis в веб-проекте — это быстрое хранилище в оперативной памяти для данных, которые нужны часто и ненадолго: кеш, сессии, очереди задач, счётчики, лимиты запросов и блокировки. Он снимает нагрузку с основной базы и ускоряет ответы, но не заменяет её: хранить в Redis единственную копию важных данных рискованно. Небольшому сайту он может быть и вовсе не нужен.

Разберём, для чего Redis используют на практике, как его настроить и когда без него можно обойтись.

Для чего Redis используют в веб-приложениях?

Redis используют там, где нужны очень быстрые чтение и запись небольших порций данных, которые можно потерять или восстановить. Все данные лежат в памяти, поэтому операции занимают доли миллисекунды — на порядки быстрее, чем запрос к базе на диске.

Задача Как Redis помогает Что будет без него
Кеширование Хранит готовые результаты тяжёлых запросов и страниц Каждый запрос нагружает базу заново
Сессии Быстрый доступ к сессии с любого сервера приложения Сессии в файлах не работают при нескольких серверах
Очереди задач Брокер для фоновых задач Можно использовать базу, но медленнее при большом потоке
Лимиты запросов Атомарные счётчики с временем жизни Защиту от перебора сложнее сделать надёжно
Блокировки Не даёт двум процессам выполнить одно действие одновременно Двойные списания, дубли задач
Счётчики и рейтинги Отсортированные множества для топов и лидербордов Тяжёлые агрегирующие запросы к базе

Как Redis используют для кеша?

Для кеша Redis хранит результаты дорогих операций с ограниченным временем жизни: приложение сначала ищет готовый результат в Redis и только при его отсутствии идёт в базу. Главные вопросы — что кешировать, на сколько и как сбрасывать кеш при изменении данных.

Пример в Laravel: кешируем каталог категорий на час и сбрасываем при изменении.

// Чтение: из Redis, а при промахе — из базы с сохранением на час
$categories = Cache::remember('catalog:categories', now()->addHour(), function () {
    return Category::query()->withCount('products')->orderBy('position')->get();
});

// Запись: после изменения категории старый кеш удаляется
Category::saved(fn () => Cache::forget('catalog:categories'));

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

Стойка с проводами и серверным оборудованием Фото: Unsplash

Можно ли хранить в Redis важные данные?

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

Настройки, которые важно проверить

  • Лимит памяти (maxmemory) — без него Redis может занять всю память сервера.
  • Политика вытеснения (maxmemory-policy) — для чистого кеша подходит allkeys-lru, для очередей и сессий вытеснение опасно.
  • Сохранение на диск — RDB-снимки и журнал AOF, если потеря данных при перезапуске недопустима.
  • Доступ — Redis не должен быть открыт в интернет; пароль и закрытая сеть обязательны.

Часто разумно разделять экземпляры: один Redis под кеш с вытеснением, другой — под очереди и сессии без него.

Когда Redis не нужен?

Redis не нужен, когда нагрузка небольшая, приложение работает на одном сервере и база справляется со всеми запросами. Лишний компонент — это ещё одна вещь, которую надо обновлять, мониторить и восстанавливать при сбое.

Признаки, что без Redis можно обойтись:

  1. Один сервер приложения — сессии и кеш могут жить в файлах или базе.
  2. Очередь задач небольшая — достаточно драйвера очередей на основе базы данных.
  3. Медленных запросов нет, или они решаются индексами — об этом в статье индексы в PostgreSQL.
  4. Нет необходимости в лимитах запросов и блокировках между серверами.

Признаки, что Redis пора добавить: несколько серверов приложения, рост очереди задач, повторяющиеся тяжёлые запросы, которые нельзя ускорить индексами, и необходимость атомарных счётчиков. Для очередей он особенно удобен — подробнее в статье очереди задач в веб-приложении.

Чем Redis отличается от Valkey и других альтернатив?

Valkey — это ответвление Redis, которое сообщество под эгидой Linux Foundation начало развивать в 2024 году после смены лицензии Redis. Для типичных задач веб-приложения они совместимы по протоколу и командам, поэтому клиенты и фреймворки работают с обоими.

Как выбирать:

  • в управляемом облаке берите то, что предлагает провайдер, — часто это Valkey или совместимый сервис;
  • при самостоятельном развёртывании проверьте условия лицензии выбранной версии;
  • для простого кеша подойдёт и Memcached, но он не умеет очереди, структуры данных и сохранение на диск.

Коротко

  • Redis — быстрое хранилище в памяти для кеша, сессий, очередей, лимитов и блокировок.
  • Кешируйте то, что часто читают и редко меняют, и сбрасывайте кеш при изменении данных.
  • Не храните в Redis единственную копию важных данных; настройте лимит памяти, вытеснение и доступ.
  • На одном сервере с небольшой нагрузкой Redis часто не нужен.
  • Valkey совместим с Redis для типичных задач; в облаке выбирайте то, что поддерживает провайдер.

Частые вопросы

  • Сколько памяти нужно Redis?

    Столько, сколько занимают ваши ключи, плюс запас на пики. Для кеша и сессий небольшого проекта обычно хватает сотен мегабайт; следите за использованием памяти в мониторинге и задайте лимит.

  • Что будет с сайтом, если Redis упадёт?

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

  • Нужен ли кластер Redis?

    Большинству проектов достаточно одного экземпляра с репликой для отказоустойчивости. Кластер нужен, когда данные не помещаются в память одного сервера или нагрузка превышает его возможности.