Redis — серверное хранилище данных, рабочий набор которого находится в оперативной памяти. Его используют для кэширования, очередей, сессий и приложений реального времени; Redis поддерживает структуры данных, сохранение на диск, репликацию и горизонтальное масштабирование через Redis Cluster.
Что такое Redis
Redis (Remote Dictionary Server) — серверное хранилище данных, в котором основной рабочий набор находится в оперативной памяти. Его используют как кэш, брокер сообщений, базу данных реального времени и контекстный слой для AI-приложений.
Redis обрабатывает команды последовательно в основном потоке. Отдельная команда выполняется атомарно, поэтому другой клиент не видит её промежуточное состояние.
Задержка зависит от сети, нагрузки, размера данных и конкретной команды. Базовую задержку самой системы можно проверить так:
redis-cli --intrinsic-latency 100Что появилось в актуальных версиях Redis 8
Официальная документация выделяет следующие изменения:
| Версия | Основные изменения |
| 8.6 | Идемпотентность Streams, политики вытеснения по времени последнего изменения, обнаружение горячих ключей, аутентификация по TLS-сертификатам, поддержка NaN в Time Series и оптимизация памяти |
| 8.8 | Структура данных Array, команда INCREX для ограничения частоты запросов, сортировка внутри групп в FT.AGGREGATE и оптимизации Search, HyperLogLog, MGET, MSET и HGETALL |
| 8.10 | Новые команды LMOVEM/BLMOVEM, SUNIONCARD/SDIFFCARD, FT.ALIASLIST, TS.NRANGE/TS.NREVRANGE и TS.READ, шаблоны хэшей, оператор COLLECT для FT.AGGREGATE, более строгий контроль тайм-аутов запросов, расширения JSONPath и оптимизации ядра, Search и JSON |
Перед обновлением с предыдущей ветки проверьте отдельную страницу нужной версии в разделе What's new и release notes: совместимость зависит от используемых команд, модулей и клиентов.
Основные возможности
| Возможность | Для чего подходит |
| Кэширование | TTL (время жизни ключей), политики вытеснения и быстрый доступ к часто используемым данным |
| Структуры данных | Strings, Hashes, Lists, Sets, Sorted Sets, Streams, Arrays, Bitmaps, HyperLogLog, геопространственные индексы и Vector Sets |
| Pub/Sub | Рассылка сообщений активным подписчикам без их долговременного хранения |
| Streams | Журнал событий с группами потребителей (consumer groups) для очередей задач и событийных систем |
| Транзакции и скрипты | MULTI/EXEC для пакетов команд и серверные скрипты для составных атомарных операций |
| Персистентность | RDB-снимки, журнал AOF или их сочетание |
| Кластеризация | Автоматическое распределение ключей по 16 384 хэш-слотам, репликация и автоматическое переключение (failover) |
| Search, JSON, Time Series и вероятностные структуры | RediSearch, RedisJSON, RedisTimeSeries и RedisBloom включены в Redis Open Source начиная с Redis 8 и распространяются по той же тройной лицензии |
| Векторный поиск | Vector Sets и Redis Search для поиска по сходству, полнотекстовых и гибридных запросов |
| Ограничение частоты запросов | INCREX в Redis 8.8 и новее позволяет собрать оконный счётчик без отдельного Lua-скрипта |
Установка и проверка подключения
macOS
brew install redis
redis-serverDocker
docker run -d --name redis -p 6379:6379 redis:8-alpineПлавающий тег 8-alpine может обновиться при следующем скачивании образа. Для воспроизводимого окружения закрепляйте конкретную версию.
Проверка результата
redis-cli ping
# PONG
redis-cli info server | grep redis_versionОтвет PONG подтверждает, что сервер принимает команды. Вторая команда показывает фактически установленную версию.
Клиентские библиотеки
| Язык | Библиотека | Установка |
| Python | redis-py | pip install redis |
| Node.js | node-redis или ioredis | npm install redis или npm install ioredis |
| Go | go-redis | go get github.com/redis/go-redis/v9 |
| Rust | redis-rs | cargo add redis |
| Java | Jedis или Lettuce | Maven или Gradle |
Подключение из Python
import redis
r = redis.Redis(
host="localhost",
port=6379,
decode_responses=True,
)
r.set("user:1:name", "Sergey", ex=3600)
print(r.get("user:1:name")) # Sergey
r.hset("session:abc", mapping={"user_id": "1", "role": "admin"})
print(r.hgetall("session:abc"))Подключение из Node.js
import { createClient } from "redis";
const redis = createClient({ url: "redis://localhost:6379" });
redis.on("error", console.error);
await redis.connect();
await redis.set("cache:prices", JSON.stringify({ usd: 92.5 }), { EX: 300 });
const prices = JSON.parse(await redis.get("cache:prices"));В продакшене используйте ACL (списки контроля доступа) или пароль и шифруйте соединение через TLS. Не размещайте пароль непосредственно в командах, исходном коде и истории терминала.
redis-cli -h redis.example.com -p 16379 --tls --askpassКлючевые структуры данных
Strings
Строки подходят для счётчиков, флагов, сериализованных объектов и простого кэша.
SET counter 0
INCR counter
INCRBY counter 10Hashes
Хэш хранит набор полей внутри одного ключа и удобен для небольших объектов.
HSET user:1 name "Sergey" role "admin" score 42
HGET user:1 name
HINCRBY user:1 score 5Sorted Sets
Sorted Set связывает каждый элемент с числовым score. Это подходит для рейтингов, лидербордов и приоритетных очередей.
ZADD leaderboard 1500 "alice" 2300 "bob" 1800 "carol"
ZRANGE leaderboard 0 -1 WITHSCORES
ZREVRANK leaderboard "bob"Streams
Streams хранят события и поддерживают распределение обработки через consumer groups.
XADD events * type "order" amount 1500
XGROUP CREATE events workers $ MKSTREAM
XREADGROUP GROUP workers agent-1 COUNT 10 BLOCK 5000 STREAMS events >После успешной обработки подтвердите сообщение по его реальному ID:
XACK events workers 1715356800000-0Персистентность и резервное копирование
Redis поддерживает два основных механизма:
- RDB создаёт периодические снимки базы. Восстановление обычно проще, но изменения после последнего снимка могут быть потеряны.
- AOF записывает операции изменения в append-only журнал. При режиме
everysecвозможна потеря последних записей при аварии.
Механизмы можно комбинировать. Выбор зависит от допустимой потери данных, времени восстановления, доступного диска и нагрузки на сервер.
# redis.conf
save 900 1
save 300 10
appendonly yes
appendfsync everysecРезервная копия должна храниться вне сервера Redis. Периодически проверяйте восстановление на отдельном окружении: наличие файла само по себе не гарантирует рабочий бэкап.
Кластеризация и ограничения Redis Cluster
| Режим | Когда использовать | Особенности |
| Standalone | Разработка и небольшие рабочие наборы | Один экземпляр без автоматического шардинга |
| Sentinel | Высокая доступность без шардинга | Мониторинг и автоматическое переключение на реплику |
| Redis Cluster | Данные или нагрузка требуют нескольких master-узлов | 16 384 хэш-слота, автоматический шардинг и реплики |
Минимальная рабочая конфигурация Redis Cluster содержит три master-узла. Официальная документация рекомендует для развёртывания шесть узлов: три master и три replica.
Учитывайте ограничения:
- multi-key команда, транзакция или скрипт могут работать с несколькими ключами только тогда, когда ключи находятся в одном хэш-слоте;
- связанные ключи можно поместить в один слот с помощью hash tag, например
user:{123}:profileиuser:{123}:account; - репликация асинхронная, поэтому Redis Cluster не гарантирует строгую согласованность и при некоторых сбоях может потерять уже подтверждённую запись;
WAITснижает вероятность потери записи, но не превращает кластер в строго согласованную систему;- при потере большинства master-узлов кластер становится недоступен;
- каждому узлу нужны клиентский порт и отдельный cluster bus port, доступный другим узлам.
Лицензирование Redis 8
Redis 8 и последующие версии можно использовать по одной из трёх лицензий:
- RSALv2 — source-available лицензия с ограничением на коммерциализацию и предоставление функциональности Redis третьим лицам как управляемого сервиса;
- SSPLv1 — source-available copyleft-лицензия с дополнительными требованиями для предоставления продукта как сервиса;
- AGPLv3 — одобренная OSI copyleft-лицензия.
RSALv2 и SSPLv1 не являются open-source лицензиями по определению OSI. Redis Open Source называют открытым ПО благодаря доступному варианту AGPLv3.
Если модифицированная версия Redis под AGPLv3 предоставляется пользователям как сетевой сервер, им необходимо дать доступ к соответствующему исходному коду. Для юридически значимого решения проверяйте полный текст выбранной лицензии и консультируйтесь с юристом.
Redis 7.2.x и более ранние версии остаются под BSD-3-Clause. Ветки 7.4.x–7.8.x используют RSALv2 или SSPLv1.
Redis Cloud: планы и изменяемые лимиты
Redis Cloud предлагает бесплатные и платные конфигурации Essentials, а также более гибкий план Pro. Размер базы, число соединений, доступность, персистентность, резервные копии, репликация и кластеризация зависят от выбранного плана.
Точные цены и числовые лимиты не зафиксированы в этом руководстве: проверяйте их в актуальном прайсинге, калькуляторе и консоли перед расчётом бюджета.
Для новых и обновлённых подписок Essentials с января 2024 года действует ограничение: одна база на подписку. При переходе на меньший план данные должны укладываться в его лимиты, иначе изменение не будет применено.
Полезные сценарии
Кэширование API-ответов
Исходное условие: внешний запрос выполняется медленно, а его результат допустимо повторно использовать в течение десяти минут.
import json
import redis
import requests
r = redis.Redis(host="localhost", port=6379, decode_responses=True)
def get_weather(city: str) -> dict:
key = f"weather:{city}"
cached = r.get(key)
if cached is not None:
return json.loads(cached)
response = requests.get(
f"https://api.example.com/weather/{city}",
timeout=10,
)
response.raise_for_status()
data = response.json()
r.set(key, json.dumps(data), ex=600)
return dataВ примере api.example.com — безопасный placeholder. Замените его на адрес вашего API.
Проверка: второй вызов с тем же городом должен вернуть тот же результат без повторного обращения к API. Такой кэш не подходит, если ответ должен отражать изменения немедленно.
Очередь задач для AI-агентов
Продюсер добавляет задания в Stream, а воркеры одной consumer group распределяют их между собой. Ниже используется объект r из раздела подключения к Python.
Перед первым чтением один раз создайте группу:
XGROUP CREATE agent:tasks workers $ MKSTREAMr.xadd("agent:tasks", {
"type": "summarize",
"url": "https://example.com/article",
})
messages = r.xreadgroup(
groupname="workers",
consumername="agent-1",
streams={"agent:tasks": ">"},
count=1,
block=5000,
)URL в примере условный. После успешной обработки подтвердите сообщение через XACK с его фактическим ID.
Проверка: сообщение появляется у одного потребителя и остаётся ожидающим подтверждения до XACK. Для надёжной обработки нужно отдельно продумать повторные попытки, идемпотентность и работу с зависшими сообщениями.
Ограничение частоты запросов
В Redis 8.8 и новее для оконного счётчика доступна команда INCREX:
INCREX ratelimit:user:1 BYINT 1 UBOUND 100 EX 60 ENXПример задаёт окно 60 секунд и верхнюю границу 100. Нулевой фактически применённый инкремент означает достижение лимита. Перед использованием проверьте синтаксис для установленной версии Redis.
Сессии и присутствие пользователей
HSET session:token123 user_id 1 role admin last_seen 1715356800
EXPIRE session:token123 3600
ZADD online_users 1715356800 "user:1"
ZRANGEBYSCORE online_users 1715356740 +infHash хранит данные сессии, а Sorted Set позволяет выбирать пользователей по времени последней активности. Проверка: у сессии должен быть положительный TTL, а пользователь должен попадать в нужный временной диапазон.
Контекст для AI-приложений
Redis можно использовать для истории диалога, кэша ответов и поиска по эмбеддингам.
import json
key = "chat:session:abc"
r.rpush(key, json.dumps({"role": "user", "content": "Что такое Redis?"}))
r.rpush(key, json.dumps({"role": "assistant", "content": "Redis — это..."}))
r.ltrim(key, -50, -1)
r.expire(key, 86400)
history = [json.loads(item) for item in r.lrange(key, 0, -1)]RPUSH сохраняет хронологический порядок сообщений. Ограничение списка и TTL сдерживают рост памяти, но не заменяют правила хранения персональных данных.
Redis Insight
Redis Insight — графический клиент для подключения к Redis, просмотра данных и выполнения команд. Он поддерживает Browser, встроенный CLI, Workbench, профилировщик, Slow Log, работу со Streams и Search workspace.
Инструмент анализа базы показывает распределение типов данных, использование памяти и ключи с наибольшим потреблением. При количестве свыше 10 000 ключей анализ использует экстраполяцию, поэтому результат следует считать оценочным.
Redis Insight предоставляется платным клиентам Redis по коммерческой лицензии, а пользователи сообщества и неплатящие пользователи используют его по SSPLv1.
Мониторинг и отладка
| Команда | Что проверяет |
INFO | Память, клиентов, репликацию, персистентность и keyspace |
SLOWLOG GET 10 | Последние команды, превысившие порог slow log |
MEMORY USAGE <key> | Оценку памяти для отдельного ключа |
redis-cli --latency | Задержку между клиентом и сервером |
MONITOR | Поток выполняемых команд для кратковременной отладки |
MONITOR выводит поток команд в реальном времени и может создавать заметную нагрузку. Используйте его кратковременно и только при необходимости.KEYS * на нагруженном сервере: команда перебирает всё пространство ключей и может надолго заблокировать обработку. Для постепенного обхода используйте SCAN.Чеклист быстрой проверки
PONG, установленная версия проверена через INFO servermaxmemory и выбрана подходящая политика вытесненияKEYS *; обход выполняется через SCANСсылки
- Документация Redis
- Что нового в Redis
- Лицензии Redis
- Масштабирование с Redis Cluster
- Redis Insight
- Redis Cloud Essentials
- Цены Redis Cloud
- GitHub: Redis
- GitHub: Valkey
Следующий шаг
Если вы строите AI-приложение с состоянием и памятью, следующим шагом будет руководство Cloudflare Agents SDK — stateful AI-агенты на Durable Objects.
Практическая конфигурация Redis зависит от допустимой потери данных, задержки и масштаба. Это обсуждение полезно, когда нужно выбрать режим развёртывания и настройки персистентности для конкретной системы.
Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov



