Redis: что это такое и как работает — полное руководство
Redis (Remote Dictionary Server) — это высокопроизводительное хранилище данных в оперативной памяти (in-memory), которое обрабатывает до 1 миллиона операций в секунду с задержкой менее 1 миллисекунды. Согласно Stack Overflow Developer Survey 2024, Redis занимает первое место среди наиболее любимых баз данных среди разработчиков четвёртый год подряд. Используется как кэш, брокер сообщений и хранилище сессий в проектах от стартапов до Twitter и GitHub.
Последнее обновление: март 2026

В отличие от PostgreSQL или MySQL, Redis хранит данные в RAM, а не на диске. Типовой запрос к Redis занимает 0.1–1 мс, к реляционной СУБД — 5–50 мс. Разница в 10–100 раз критична при высокой нагрузке: 10 000 RPS на PostgreSQL — это стресс, для Redis — рабочий режим.
Redis это: ключевые характеристики и архитектура
Redis создан в 2009 году итальянским разработчиком Сальваторе Санфилиппо — он написал его для ускорения своего стартапа, когда PostgreSQL перестал справляться с нагрузкой. Сегодня проект поддерживает Redis Ltd., исходный код открыт на GitHub под лицензией BSD.
Что делает Redis таким быстрым:
- In-memory архитектура — все данные в RAM, I/O на диск только для персистентности
- Single-threaded событийный цикл — нет блокировок и гонок данных, нет накладных расходов на mutex
- Эффективные структуры данных — skiplist для Sorted Set, ziplist для компактных Hash, intset для Set из чисел
- Пайплайнинг — отправка нескольких команд за один TCP-пакет снижает latency сети
- Lua-скрипты — атомарное выполнение сложных операций на стороне сервера
С версии Redis 6.0 добавлена многопоточность для I/O-операций (чтение/запись сетевых пакетов), при этом обработка команд остаётся однопоточной. Это позволило удвоить пропускную способность без жертв консистентностью.
Основные структуры данных Redis
Именно богатый набор структур данных отличает Redis от простых key-value хранилищ. Каждая структура оптимизирована для конкретных паттернов доступа.
String — базовый тип, хранит текст, числа и бинарные данные (до 512 МБ). Используется для счётчиков, флагов, простого кэша:
SET user:1001:name "Иван Петров"
GET user:1001:name
INCR page:views:home # Атомарный инкремент
EXPIRE session:abc123 3600 # TTL 1 час
Hash — аналог объекта/словаря. Идеален для атрибутов сущности без сериализации в JSON. 100 полей Hash потребляют меньше памяти, чем 100 отдельных String-ключей:
HSET user:1001 name "Иван" email "ivan@example.com" role "admin"
HGET user:1001 email
HGETALL user:1001
List — двусвязный список с O(1) добавлением/удалением с концов. Используется как очередь задач (RPUSH + BLPOP) или история действий:
RPUSH notifications:user:1001 "Заказ #4521 отправлен"
BLPOP notifications:user:1001 0 # Блокирующий pop (worker-паттерн)
LLEN notifications:user:1001
Set — уникальные элементы без порядка. Подходит для тегов, онлайн-пользователей, уникальных IP-адресов. Поддерживает операции объединения и пересечения за O(N):
SADD online:users 1001 1002 1003
SISMEMBER online:users 1001 # True/False за O(1)
SUNIONSTORE vip:users admins:users premium:users
Sorted Set — элементы с числовым score, автоматически упорядоченные. Идеален для лидербордов, очередей с приоритетом, отсортированных временных рядов:
ZADD leaderboard 9850 "player:alice" 7200 "player:bob"
ZRANGE leaderboard 0 9 WITHSCORES REV # Топ-10
ZRANK leaderboard "player:alice" # Позиция в рейтинге
Stream — журнал событий в стиле Kafka. Добавлен в Redis 5.0: персистентный лог с consumer groups, подтверждениями доставки (ACK) и ретентшн-политикой по времени или объёму.
Как установить Redis через Docker
Самый быстрый способ развернуть Redis локально — docker redis образ. Полностью готово за 30 секунд:
# Запуск Redis 7 (Alpine — минимальный образ, 45 МБ)
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
redis:7-alpine \
redis-server --appendonly yes --requirepass "yourStrongPassword"
# Проверка
docker exec -it redis redis-cli -a yourStrongPassword ping
# PONG
Флаг --appendonly yes включает AOF-персистентность: каждая команда дозаписывается в файл, данные переживают перезапуск контейнера. Параметр --requirepass обязателен — Redis без пароля на production равен открытой БД в интернете (именно так взломали тысячи серверов в 2016–2020 годах).
В боевых проектах Redis добавляется в docker-compose.yml рядом с PostgreSQL и приложением. Это стандартная связка для enterprise-систем в нашей разработке программного обеспечения.
Redis CLI — управление из командной строки
Redis CLI — интерактивный клиент для отладки и администрирования. Подключение:
redis-cli -h localhost -p 6379 -a yourPassword
# Диагностика
INFO memory # Использование RAM, fragmentation ratio
INFO stats # Кол-во команд, hits/misses кэша
INFO replication # Статус репликации
MONITOR # Лог всех команд (только для debug, отключает 50% производительности)
# Безопасный перебор ключей (вместо KEYS *)
SCAN 0 MATCH user:* COUNT 100 # Итератор с пагинацией
SCAN cursor MATCH pattern COUNT n
Команда KEYS * блокирует Redis на время выполнения — на сервере с 10 миллионами ключей это заморозит его на несколько секунд. Никогда не используйте её на production. Вместо неё — SCAN с небольшим COUNT, он работает постепенно и не блокирует сервер.

Redis в Java и Spring Boot: интеграция за 1 час
Spring Boot предоставляет автоконфигурацию для Redis через Spring Data Redis. Подключение:
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
# application.properties
spring.data.redis.host=localhost
spring.data.redis.port=6379
spring.data.redis.password=yourPassword
spring.data.redis.timeout=2000ms
spring.cache.type=redis
spring.cache.redis.time-to-live=600000 # TTL 10 минут
Кэширование через аннотации — самый простой и читаемый подход:
@Service
public class ProductService {
@Cacheable(value = "products", key = "#id")
public Product getProduct(Long id) {
// Вызывается только при cache miss
// При повторном запросе данные берутся из Redis мгновенно
return productRepository.findById(id).orElseThrow();
}
@CacheEvict(value = "products", key = "#product.id")
public Product updateProduct(Product product) {
return productRepository.save(product);
}
@CachePut(value = "products", key = "#result.id")
public Product createProduct(Product product) {
return productRepository.save(product);
}
}
Для сложных сценариев — прямая работа через RedisTemplate:
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// Сохранить сессию с TTL 2 часа
redisTemplate.opsForValue()
.set("session:" + token, userDto, Duration.ofHours(2));
// Атомарный счётчик запросов (rate limiting)
Long count = redisTemplate.opsForValue().increment("ratelimit:" + ip);
if (count == 1) redisTemplate.expire("ratelimit:" + ip, Duration.ofMinutes(1));
// Pub/Sub: публикация события
redisTemplate.convertAndSend("channel:orders", orderEvent);
В проектах на JMIX и Spring Boot Redis берёт на себя: кэш результатов тяжёлых SQL-запросов, хранилище JWT-сессий, Pub/Sub для уведомлений и распределённые блокировки (RedLock) при конкурентном доступе к ресурсам. Типичный результат внедрения — снижение нагрузки на PostgreSQL на 40–70%.
Redis или PostgreSQL: сравнение для выбора архитектуры
| Критерий | Redis | PostgreSQL |
|---|---|---|
| Скорость чтения | 0.1–1 мс | 5–50 мс |
| Пропускная способность | До 1 млн ops/sec | 5 000–50 000 ops/sec |
| Объём данных | Ограничен RAM (обычно до 256 ГБ) | Не ограничен (диск) |
| Персистентность | RDB/AOF (настраиваемая) | Гарантированная ACID |
| Транзакции | MULTI/EXEC (без rollback) | Полный ACID с rollback |
| Сложные запросы | Нет (только ключи) | Да (SQL, JOIN, агрегации) |
| Стоимость хранения | Дорого (RAM) | Дёшево (SSD/HDD) |
| Репликация | Master-Replica, Sentinel, Cluster | Streaming replication |
Правило простое: Redis дополняет PostgreSQL, а не заменяет его. Храните «источник истины» в PostgreSQL, а горячие данные с частым чтением — в Redis. Это стандартная архитектура для высоконагруженных REST API.
Часто задаваемые вопросы о Redis
Сколько данных может хранить Redis?
Теоретически — без ограничений, практически — столько, сколько оперативной памяти на сервере. На машине с 32 ГБ RAM Redis эффективно хранит около 25–28 ГБ данных (остаток — overhead ОС и самого Redis). Для больших объёмов используют Redis Cluster с шардингом данных по нескольким нодам. Каждая нода независима, масштабирование горизонтальное.
Теряются ли данные при перезапуске Redis?
При правильной настройке — нет. Redis поддерживает два механизма персистентности: RDB (снимки каждые N секунд или M операций) и AOF (лог каждой команды). AOF с appendfsync everysec гарантирует потерю максимум 1 секунды данных при аварии. Для критических бизнес-данных Redis всегда используется совместно с PostgreSQL как основным хранилищем.
Как обеспечить отказоустойчивость Redis?
Для автоматического failover — Redis Sentinel: 3 процесса Sentinel следят за мастером, при его падении выбирают нового за 10–30 секунд и переключают клиентов. Для горизонтального масштабирования — Redis Cluster (минимум 3 мастер-ноды с репликами). Managed Redis (AWS ElastiCache, Yandex MDB, DigitalOcean Managed Redis) берёт настройку отказоустойчивости на себя — рекомендую для команд без отдельного DevOps.
Можно ли использовать Redis вместо Kafka?
Redis Streams — упрощённый аналог Kafka для простых сценариев. Если нужны миллионы сообщений в секунду, многомесячное хранение лога, сложные топологии consumer groups — берите Apache Kafka. Для задач попроще (push-уведомления, WebSocket broadcast, фоновые задачи с небольшим объёмом) Redis Streams справляется и проще в эксплуатации: нет ZooKeeper, нет отдельного кластера, один сервис вместо пяти.