Перейти к основному содержимому

3.06. Redis

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Redis

STRING, LIST, SET, HASH, ZSET (Sorted Set)
Короткие структуры (ziplist, intset)
Упаковка данных в STRING
Пайплайны (Pipelining): Как группировка команд в один сетевой запрос может кардинально повысить производительность.
Серверные скрипты: Как Lua позволяет выполнять сложную логику прямо на стороне сервера Redis, атомарно и с высокой производительностью.
Построение компонентов - автозаполнение, распределенные блокировки, семафоры, очереди задач (FIFO, отложенные), системы обмена сообщениями (pull/push), распределение файлов.
Репликация (Master/Slave)
Сохранение данных (Persistence): Разница между RDB (снимки) и AOF (журнал), их плюсы, минусы и настройки.
Шардирование (Sharding)

Redis = Remote Dictionary Server — буквально «удалённый сервер словаря»
распределённое хранилище типа ключ → значение, к которому можно обращаться по сети.
Название подчёркивает идею удалённого доступа к структурам данных, как к словарю (ассоциативному массиву).
Резидентная СУБД. Резидентная — означает, что данные постоянно находятся в оперативной памяти (RAM) во время работы.
Redis — это in-memory data store: все данные хранятся в RAM для максимальной скорости доступа. Однако Redis не теряет данные при перезапуске, если включена персистентность (RDB/AOF) — так что это не просто временное хранилище. Правильнее говорить: «In-memory data structure store» — так Redis себя называет официально.

Хотя часто используется как кэш, Redis может быть:
Основной базой данных (если данные помещаются в RAM).
Брокером сообщений (через PUB/SUB, Streams).
Хранилищем сессий, очередей, временных данных.
Поддерживает реальное время: например, онлайн-чаты, уведомления, активность пользователей.

Помимо базовых типов, Redis поддерживает:
HyperLogLog — для оценки уникальных значений (например, уникальные посетители).
Bitmaps — эффективное хранение бинарных флагов (например, активность пользователя по дням).
Geospatial indexes — работа с географическими координатами (GEOADD, GEORADIUS).
Streams — логи событий в реальном времени (аналог Kafka в миниатюре).
JSON — через модуль RedisJSON, теперь можно хранить и запрашивать JSON-объекты.
Vectors — для работы с эмбеддингами в AI/ML (поиск по схожести текстов, изображений и т.п.).

Redis можно расширять с помощью модулей:
RedisJSON — работа с JSON.
RediSearch — полнотекстовый поиск и индексация.
RedisAI — выполнение ML-моделей прямо в Redis.
RedisGraph — графовая база данных.
RedisBloom — фильтры Блума, Count-Min Sketch.

Кластеризация и высокая доступность
Redis Cluster — встроенная поддержка шардирования и отказоустойчивости.
Автоматическое распределение ключей по нодам.
Поддержка master-slave репликации внутри кластера.
Переключение на реплику при падении мастера (failover).
На сайте: "Automatically split your data across multiple nodes to improve uptime."

Active-Active Geo-Distribution (CRDT)
Через Redis Enterprise доступна мультимастерная репликация между дата-центрами.
Данные синхронизируются в реальном времени между регионами.
Гарантируется локальная задержка <1 мс и 99.999% uptime.
Полезно для глобальных приложений (SaaS, fintech, e-commerce).

Производительность и масштабируемость
Все операции — в памяти → микросекундная задержка.
Поддерживает десятки тысяч операций в секунду на одном узле.
Горизонтальное масштабирование через шардирование (ручное или кластер).
Поддержка pipelining и массовых команд (MGET, MSET) — снижает сетевые задержки.

Работа с окружениями и облачными платформами
Как указано на redis.io: работает с:
AWS, Google Cloud, Azure
Kubernetes, Docker
Vercel, Heroku
Можно развернуть:
On-premise (свои серверы)
В облаке (Redis Cloud, Amazon ElastiCache, Azure Cache for Redis)
В контейнерах

Lua-скрипты: атомарность и скорость
Lua-скрипты выполняются атомарно — никакие другие команды не вклиниваются.
Полезно для:
Условных операций («если X, то Y»).
Реализации сложной логики без сетевых задержек.
Атомарных транзакций (аналог MULTI/EXEC, но мощнее).
Пример: реализация rate-limiting (ограничение запросов) за один вызов.

Транзакции (MULTI/EXEC)
Redis поддерживает простые транзакции:
MULTI — начинает блок команд.
EXEC — выполняет все команды атомарно.
Но: нет rollback, если одна команда упадёт.
Лучше использовать Lua-скрипты для сложной логики.

Pub/Sub и Streams — брокер сообщений
PUB/SUB — простая модель publish-subscribe (один-ко-многим).
Используется для чатов, уведомлений.
Минус: нет сохранения сообщений (если подписчик offline — пропустит).
Redis Streams — более продвинутый аналог:
Хранит историю сообщений.
Поддерживает группы потребителей (consumer groups).
Аналог Kafka, но проще и легче.

Безопасность
Поддержка:
Парольной аутентификации (requirepass).
Шифрования (TLS/SSL) — в новых версиях.
ACL (Access Control Lists) — с версии 6.0:
Разные пользователи с разными правами.
Например: readonly-пользователь для кэша, admin — для управления.

Инструменты и экосистема
RedisInsight — официальный GUI от Redis Inc.
Визуализация данных, мониторинг, отладка, работа с JSON, поиск.
Поддержка Redis Stack (все модули).
CLI (redis-cli) — мощный интерактивный клиент.
Клиентские библиотеки:
Python: redis-py
Node.js: ioredis, node-redis
Java: Jedis, Lettuce
Go: go-redis
.NET: StackExchange.Redis

Redis Stack
Сборка от Redis Inc., включающая:
Redis + модули (JSON, Search, AI, Bloom, Timeseries).
RedisInsight.
CLI и SDK.
Позволяет быстро строить приложения с полнотекстовым поиском, AI, аналитикой.

Интеграция с AI
Как указано на сайте: "Build AI apps with more speed, memory, and accuracy."
Redis используется в AI-приложениях для:
Хранения эмбеддингов (векторов).
Поиска по схожести (similarity search).
Кэширования ответов LLM.
Хранения контекста диалога.
Интеграция с LangChain, LlamaIndex и др.

Производительность vs. SQL
SQL-базы: медленнее, потому что данные на диске, нужен парсинг запросов, транзакции, индексы.
Redis: всё в RAM → быстрее в 10–1000 раз.
Но: ограничен объёмом памяти, нет JOIN’ов, сложных запросов.
Идеален для горячих данных, которые нужны постоянно.

Redis хранит данные в виде ключ-значение, причём в оперативной памяти (RAM), поэтому он очень быстрый. Это идеальный пример механизма кэширования. Применяется в кэшировании (ускорении сайтов), сессиях пользователей, очередях задач, чат-приложений, чтобы обеспечить высокую скорость работы, не обращаться лишний раз к SQL, так как хранилище SQL хранится на диске, и при каждом запросе идёт чтение с диска.

Ключ — это строка (например, user:1000).

Значение может быть различных типов:

  • Строка (string): "JohnDoe".
  • Хэш (hash): {"name": "John", "age": 30}.
  • Список (list): ["task1", "task2", "task3"].
  • Множество (set): уникальные элементы, например, {"apple", "banana", "cherry"}.
  • Упорядоченное множество (sorted set): элементы с приоритетами, например, {("task1", 1), ("task2", 2)}.

Создание данных:

SET user:1000 "Solid Snake"

Чтение данных:

GET user:1000

Обновление данных:

SET user:1000 "Big Boss"

Удаление данных:

DEL user:1000

Redis также поддерживает персистентность (сохранение данных на диск):

  • RDB (Redis Database File) : создание моментальных снимков данных через определённые интервалы.
  • AOF (Append-Only File) : запись всех операций в файл для восстановления данных после перезапуска.

Устанавливается Redis как на Windows, так и на Linux.

Для администрирования используются графические инструменты:

  • RedisInsight (официальный GUI, в комплекте);
  • Another Redis Desktop Manager.

Специальные фреймворки и библиотеки для работы – ioredis, redis-py, Jedis и другие.

Redis часто используется как кэш для ускорения веб-приложений, к примеру в JavaScript можно работать с таким кэшем:

const redis = require('redis');
const client = redis.createClient();

// Проверяем, есть ли данные в кэше
client.get('user:1000', (err, data) => {
if (data) {
console.log('Данные из кэша:', data);
} else {
// Если данных нет, получаем их из базы данных
const userData = { name: 'Max', age: 30 };
client.set('user:1000', JSON.stringify(userData));
console.log('Данные сохранены в кэш');
}
});

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

Официальный сайт Redis - https://redis.io/

Чит-лист - https://cheatsheets.zip/redis