// Engineering Log

Базы данных: Часть 5 — Redis и Valkey

Опубликовано 21.09.2026

// Быстрый маршрут

Эта статья относится к теме Серверы и инфраструктура.

Redis (Remote Dictionary Server) — хранилище данных типа «ключ — значение», которое держит все данные в оперативной памяти. Благодаря этому операции выполняются за доли миллисекунды. Redis редко служит основной базой данных приложения: обычно он работает рядом с PostgreSQL или MySQL и берёт на себя задачи, где важна скорость — кеш, сессии, очереди, счётчики.

Значением в Redis может быть не только строка, но и структура данных: список, множество, хеш, упорядоченное множество, поток (stream), битовый массив, HyperLogLog для приблизительного подсчёта уникальных значений, геоиндекс. Для каждой структуры есть свои атомарные команды, поэтому многие задачи решаются одной командой без блокировок на стороне приложения.

Лицензия: что изменилось с 2024 года

До весны 2024 года Redis распространялся под свободной лицензией BSD. С этим связана путаница в старых статьях и документации.

  • Март 2024, Redis 7.4. Компания Redis перевела проект на две лицензии на выбор — RSALv2 и SSPLv1. Обе ограничивают предоставление Redis как облачной услуги и не признаются открытыми по определению Open Source Initiative (OSI).
  • Март 2024, Valkey. В ответ сообщество под эгидой Linux Foundation создало форк Valkey на основе последней версии под BSD (7.2.4). Valkey остаётся под лицензией BSD и развивается независимо; на сентябрь 2026 года актуальная ветка — 9.x.
  • Май 2025, Redis 8. К двум лицензиям добавлена третья — AGPLv3, одобренная OSI. Redis 8 снова можно использовать как открытое ПО, но AGPL требует раскрывать исходный код изменённой версии, если она предоставляется пользователям по сети.

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

Что вошло в Redis 8

Раньше расширенные возможности поставлялись отдельно — как модули и сборка Redis Stack. В Redis 8 они включены в основную версию:

  • Redis Query Engine — вторичные индексы, полнотекстовый поиск и векторный поиск (прежний модуль RediSearch);
  • JSON — хранение и изменение JSON-документов по отдельным полям;
  • Time Series — временные ряды;
  • вероятностные структуры — фильтры Блума, Count-Min Sketch, Top-K и другие;
  • vector sets — новый тип данных для векторного поиска.

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

Основные сценарии

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

maxmemory 512mb
maxmemory-policy allkeys-lru

Сессии пользователей. Идентификатор сессии — ключ, данные сессии — значение с ограниченным сроком жизни (SET session:abc ... EX 3600). Несколько серверов приложения видят одни и те же сессии.

Очереди задач. Списки (LPUSH/BRPOP) и потоки (XADD/XREADGROUP) используются как простой брокер сообщений. На них построены, например, очереди Sidekiq в Ruby и RQ в Python; Celery может использовать Redis как брокер. Механизм PUBLISH/SUBSCRIBE подходит для уведомлений в реальном времени, но сообщения в нём не сохраняются: если подписчик был отключён, он их не получит.

Счётчики и рейтинги. INCR атомарно увеличивает счётчик просмотров или попыток входа, а упорядоченные множества (ZADD, ZRANGE) позволяют поддерживать таблицу лидеров без пересчёта.

Ограничение частоты запросов. Счётчик с временем жизни — стандартный способ ограничить число запросов к API с одного адреса или от одного пользователя.

Сохранение данных на диск

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

RDB — снимки. Через заданные интервалы Redis записывает полную копию данных в файл dump.rdb. Файл компактный, удобен для резервных копий и быстро загружается. Недостаток: при аварийной остановке теряются изменения с момента последнего снимка — обычно несколько минут.

save 3600 1 300 100 60 10000   # снимок, если за час изменился 1 ключ, за 5 минут — 100, за минуту — 10 000

AOF — журнал операций. Каждая изменяющая команда дописывается в журнал, который при старте воспроизводится заново. С настройкой по умолчанию appendfsync everysec при сбое теряется не больше секунды записи.

appendonly yes
appendfsync everysec

Документация Redis рекомендует включать оба механизма, если нужна сохранность данных, сравнимая с PostgreSQL. Если Redis используется только как кеш, сохранение можно отключить совсем (save "", appendonly no) — данные будут заново наполнены приложением.

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

Безопасность: базовая настройка

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

Минимальная безопасная конфигурация redis.conf для сервера, где Redis использует только локальное приложение:

bind 127.0.0.1 -::1
protected-mode yes
port 6379

# отключаем пользователя по умолчанию и создаём отдельного для приложения
user default off
user app on >очень-длинный-случайный-пароль ~* &* +@all -@dangerous

Что здесь происходит:

  • bind — Redis принимает соединения только с локального адреса. Если приложение на другом сервере, укажите внутренний адрес частной сети, а не публичный;
  • protected-mode yes — с версии 3.2 Redis без пароля и с привязкой ко всем интерфейсам отвечает только локальным клиентам;
  • user ... -@dangerous — списки доступа (ACL, появились в Redis 6) запрещают пользователю приложения опасные команды: FLUSHALL, CONFIG, KEYS, DEBUG и другие. В эту категорию входят также INFO, CLIENT и SORT; если приложение или его библиотека ими пользуются, разрешите нужные команды явно, например +info. Для совсем простой установки можно ограничиться общим паролем requirepass, но ACL гибче.

Кроме того, порт 6379 нужно закрыть межсетевым экраном, а Redis запускать от отдельного непривилегированного пользователя, а не от root.

Типичные ошибки

  • Порт открыт наружу через Docker. Запись -p 6379:6379 в docker run или ports: - "6379:6379" в Compose публикует порт на всех интерфейсах сервера, причём Docker добавляет свои правила iptables в обход ufw. В официальном образе Redis защищённый режим по умолчанию отключён. Если Redis нужен только соседним контейнерам, порт публиковать не нужно, а для доступа с хоста — 127.0.0.1:6379:6379.
  • Нет ограничения памяти. Без maxmemory кеш растёт до исчерпания оперативной памяти, и системный механизм OOM завершает процесс.
  • Команда KEYS * в рабочей базе. Она перебирает все ключи и блокирует сервер на время перебора. Для обхода ключей используют SCAN.
  • Redis как единственное хранилище важных данных без AOF. При перезапуске теряется всё, что не попало в последний снимок.

Достоинства

  • Скорость. Задержка — доли миллисекунды, сотни тысяч операций в секунду на одном экземпляре.
  • Структуры данных. Многие задачи решаются готовыми командами без дополнительного кода.
  • Атомарность. Команды выполняются последовательно, поэтому счётчики и очереди работают корректно без блокировок в приложении. Для нескольких команд подряд есть транзакции MULTI/EXEC и скрипты на Lua.
  • Репликация и кластер. Реплики для отказоустойчивости, Redis Sentinel для автоматического переключения, Redis Cluster для распределения данных между узлами.
  • Экосистема. Клиентские библиотеки есть для всех распространённых языков.

Недостатки

  • Объём ограничен памятью. Все данные должны помещаться в оперативную память, а она дороже диска.
  • Нет сложных запросов. Соединений таблиц и произвольной агрегации, как в SQL, нет. Query Engine в Redis 8 добавляет поиск по индексам, но не заменяет реляционную базу.
  • Сохранность требует настройки. По умолчанию возможна потеря данных за последние минуты.
  • Команды выполняются в одном потоке. С версии 6.0 сетевой ввод-вывод можно распределить по нескольким потокам (io-threads), но сами команды по-прежнему выполняются последовательно, поэтому одна медленная команда задерживает все остальные.

Когда использовать

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

// Похожая задача

Если у вас похожая ситуация

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

Тема статьи

Серверы и инфраструктура

VPS, Linux, веб-стек, миграции, хостинг, базы данных и базовая эксплуатация.

Часто с этим приходят

  • Перенести сайт или сервис на новый сервер
  • Настроить Linux, Nginx, базу данных и бэкапы
  • Разобраться, почему всё работает нестабильно

// Следующий шаг

Если вам нужна не только статья, а помощь по этой теме, удобнее сразу перейти в услугу. Главная и подборка материалов остаются рядом.

Открыть услуги

// Contact

Нужна помощь?

Свяжись со мной и я помогу решить проблему

Написать в Telegram

Отвечаю в течение рабочего дня (03:00–13:00 GMT)

Или оставьте заявку здесь:

Подтвердите, что вы не бот.

Написать и получить быстрый ответ