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

Что такое Redis

Redis (Remote Dictionary Server) — серверное хранилище данных, в котором основной рабочий набор находится в оперативной памяти. Его используют как кэш, брокер сообщений, базу данных реального времени и контекстный слой для AI-приложений.

Redis обрабатывает команды последовательно в основном потоке. Отдельная команда выполняется атомарно, поэтому другой клиент не видит её промежуточное состояние.

Задержка зависит от сети, нагрузки, размера данных и конкретной команды. Базовую задержку самой системы можно проверить так:

redis-cli --intrinsic-latency 100
📌
Актуально на 9 сентября 2026 года. Официальная документация уже описывает Redis 8.10. Redis 8 и последующие версии доступны по выбору под RSALv2, SSPLv1 или AGPLv3; только AGPLv3 из этих трёх лицензий одобрена OSI.

Что появилось в актуальных версиях 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-server

Docker

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 подтверждает, что сервер принимает команды. Вторая команда показывает фактически установленную версию.

Клиентские библиотеки

ЯзыкБиблиотекаУстановка
Pythonredis-pypip install redis
Node.jsnode-redis или ioredisnpm install redis или npm install ioredis
Gogo-redisgo get github.com/redis/go-redis/v9
Rustredis-rscargo add redis
JavaJedis или LettuceMaven или 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 10

Hashes

Хэш хранит набор полей внутри одного ключа и удобен для небольших объектов.

HSET user:1 name "Sergey" role "admin" score 42
HGET user:1 name
HINCRBY user:1 score 5

Sorted 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
💡
Для очереди с повторным чтением и подтверждением обработки используйте Streams. Pub/Sub подходит только тогда, когда потеря сообщения для отключённого подписчика допустима.

Персистентность и резервное копирование

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 $ MKSTREAM
r.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 +inf

Hash хранит данные сессии, а 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 server
Для изменяемых возможностей сверена документация именно установленной версии
Настроена подходящая стратегия RDB, AOF или их сочетания
Проверено восстановление из внешней резервной копии
Установлен maxmemory и выбрана подходящая политика вытеснения
Для кэшируемых ключей задан TTL
В продакшене настроены ACL или пароль и TLS
В коде нет KEYS *; обход выполняется через SCAN
Для очередей с подтверждением используются Streams
Для Redis Cluster клиент поддерживает перенаправления и карту слотов
Учтена возможность потери подтверждённых записей при сбоях кластера
Настроены метрики памяти, задержки, репликации и персистентности

Ссылки

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

Если вы строите AI-приложение с состоянием и памятью, следующим шагом будет руководство Cloudflare Agents SDK — stateful AI-агенты на Durable Objects.

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

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov