Gymterview
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 и не упомянуть однопоточную модель.