junior
Что такое Redis и когда его использовать?
Redis (Remote Dictionary Server) — это in-memory key-value хранилище данных, используемое как кэш, брокер сообщений и база данных, обеспечивающее latency менее 1 мс за счёт хранения данных в оперативной памяти.
Аналогия из жизни: Redis — это как блокнот на рабочем столе: информация записана прямо перед глазами и доступна мгновенно, в отличие от папок в архиве (БД), до которых нужно идти.
Когда использовать Redis
- Распределённый кэш (несколько экземпляров приложения)
- Сессии пользователей (вместо sticky sessions)
- Rate limiting (ограничение запросов)
- Распределённые блокировки (distributed locks)
- Очереди задач (Redis Streams)
- Pub/Sub (уведомления в реальном времени)
- Leaderboards, счётчики (атомарные операции)
Redis vs Memcached
| Критерий | Redis | Memcached |
|---|---|---|
| Структуры данных | String, List, Set, Hash, Sorted Set, Stream и др. | Только String |
| Персистентность | RDB снимки, AOF лог | Нет |
| Репликация | Master-Replica, Cluster | Нет |
| Pub/Sub | Да | Нет |
| Lua-скрипты | Да | Нет |
| Размер значения | 512 MB | 1 MB |
| Многопоточность | Один поток (I/O threads с 6.0) | Многопоточный |
Конфигурация подключения в Spring Boot
Пример
spring:
data:
redis:
host: localhost
port: 6379
password: secret
timeout: 2000ms
lettuce:
pool:
max-active: 16
max-idle: 8
min-idle: 4
Работа с Redis через RedisTemplate
Пример кода
@Service
public class RedisService {
private final StringRedisTemplate redisTemplate;
// Простое key-value
public void cacheUser(Long id, String json) {
redisTemplate.opsForValue().set("user:" + id, json, Duration.ofMinutes(10));
}
public String getCachedUser(Long id) {
return redisTemplate.opsForValue().get("user:" + id);
}
// Hash — отдельные поля объекта
public void cacheUserFields(Long id, Map<String, String> fields) {
redisTemplate.opsForHash().putAll("user:" + id, fields);
redisTemplate.expire("user:" + id, Duration.ofMinutes(10));
}
// Sorted Set — leaderboard
public void addScore(String player, double score) {
redisTemplate.opsForZSet().add("leaderboard", player, score);
}
public Set<String> getTopPlayers(int count) {
return redisTemplate.opsForZSet().reverseRange("leaderboard", 0, count - 1);
}
// Distributed lock (простой вариант)
public boolean acquireLock(String key, Duration timeout) {
return Boolean.TRUE.equals(
redisTemplate.opsForValue().setIfAbsent("lock:" + key, "1", timeout));
}
public void releaseLock(String key) {
redisTemplate.delete("lock:" + key);
}
}
Архитектура Redis
- Однопоточный основной цикл — атомарность операций гарантирована без блокировок
- Вся БД в RAM — быстро, но ограничено объёмом памяти
- Redis Cluster — горизонтальное масштабирование (шардирование по ключам)
- Redis Sentinel — автоматический failover (master-replica)
Частые ошибки
- Хранить в Redis данные без TTL — память исчерпается; всегда устанавливайте TTL
- Большие значения (>100 KB) — замедляют Redis; если нужно хранить большие объекты, используйте сжатие или ссылки
- Использовать Redis как primary database — Redis не заменяет PostgreSQL; данные должны быть восстановимы из основной БД
KEYS *в production — блокирует Redis; используйтеSCANдля итерации- Распределённая блокировка через
SETNX— упрощённая реализация ненадёжна; используйте Redisson или Redlock
Как используется в 2026
- Redis 7.x — стабильная production-версия; Redis Functions (замена Lua), ACL, multi-threading I/O
- Spring Data Redis + Lettuce — стандартный клиент (вместо Jedis)
- Redis Stack — Redis + поиск (RediSearch), JSON (RedisJSON), Time Series
- Managed Redis: AWS ElastiCache, Azure Cache for Redis, GCP Memorystore
На собеседовании: интервьюер ожидает, что вы знаете не только определение Redis, но и конкретные сценарии использования (кэш, сессии, блокировки, очереди). Частая ошибка — не знать отличия от Memcached и не упомянуть однопоточную модель.