← назад к разделу

Представьте: каждый запрос на главную страницу заново читает одни и те же данные из базы. Пока пользователей немного — терпимо. Но чем больше запросов, тем дольше ждёт каждый. Redis решает это, держа горячие данные прямо в оперативной памяти.

Почему Redis такой быстрый

Redis — это in-memory хранилище типа «ключ — значение». В отличие от PostgreSQL или MySQL, которые хранят данные на диске, Redis держит всё в оперативной памяти. Обращение к памяти быстрее дисковых операций на несколько порядков: вместо миллисекунд — микросекунды.

Вторая причина скорости — однопоточная обработка команд. Redis не тратит время на блокировки и переключения контекста между потоками: команды выполняются последовательно, без конкуренции. Каждая отдельная команда (GET, SET, ZADD) атомарна — никаких частичных состояний.

Короткая формула: оперативная память + однопоточная модель = задержка менее 1 мс на операцию.

Когда применять Redis

Redis хорошо решает задачи, где нужен быстрый доступ к данным или временное хранение:

Кэш — самый распространённый случай. Результат тяжёлого запроса к базе сохраняем в Redis на несколько минут. Следующий пользователь получает ответ мгновенно, без обращения к БД.

Сессии — вместо хранения состояния в базе или в памяти одного процесса, сессия живёт в Redis. Это позволяет запускать несколько экземпляров приложения: любой из них найдёт сессию пользователя.

Счётчики — атомарная команда INCR увеличивает число без риска гонки данных. Удобно для счётчиков просмотров, лайков, рейтингов.

Rate limiting — ограничение числа запросов. Сохраняем счётчик запросов за последнюю минуту с автоматическим истечением (TTL), и легко реализуем «не более 100 запросов в минуту».

Очереди задач — структура списка (LIST) позволяет организовать простую очередь: один процесс добавляет задачи, другой забирает и выполняет.

Когда Redis не подходит

Redis не заменяет основную базу данных — и это важно понимать с самого начала.

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

Не стоит хранить в Redis большие объёмы данных: оперативная память дороже диска, а Redis не умеет делать сложные JOIN-запросы или полнотекстовый поиск.

Правило: Redis — ускоритель рядом с основной базой, не замена ей.

Базовые команды

Прежде чем подключать библиотеку, полезно поработать с Redis напрямую через CLI.

Запускаем клиент:

redis-cli

SET и GET — записать и прочитать

# Записать строку
SET user:42:name "Иван"

# Прочитать
GET user:42:name
# → "Иван"

Ключ — произвольная строка. Принято строить имена через двоеточие: сущность:id:поле. Это удобно для поиска и понимания структуры данных.

EXPIRE и TTL — время жизни ключа

TTL (time to live) — сколько секунд ключ ещё будет жить. Когда время истечёт, Redis удалит его автоматически.

# Установить TTL в 60 секунд
EXPIRE user:42:name 60

# Проверить, сколько осталось
TTL user:42:name
# → 58  (прошло 2 секунды)
# → -1  (TTL не задан, ключ живёт вечно)
# → -2  (ключ уже удалён)

Можно установить ключ и TTL одной командой:

# SET с опцией EX — истечёт через 300 секунд
SET session:abc123 "данные сессии" EX 300

DEL — удалить вручную

DEL user:42:name
# → 1 (удалён один ключ)

EXISTS — проверить наличие

EXISTS user:42:name
# → 1 (есть) или 0 (нет)

SETNX — записать, только если ключа нет

SETNX (SET if Not eXists) — атомарная операция: ключ установится только тогда, когда его ещё не существует. Это основа для распределённых блокировок.

SETNX lock:order:99 "worker-1"
# → 1 (успешно — никто не держит блокировку)
# → 0 (ключ уже есть — кто-то другой захватил)

Подключение из Java / Spring Boot

В Spring Boot подключение к Redis стоит на трёх вещах: зависимость, настройка в application.yml, и бин RedisTemplate или автоматическое кэширование через @Cacheable.

Зависимость

// build.gradle
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

Spring Boot автоматически подтянет Lettuce — асинхронного клиента Redis.

Настройка подключения

# application.yml
spring:
  data:
    redis:
      host: localhost
      port: 6379

Запись и чтение через RedisTemplate

RedisTemplate — низкоуровневый способ: полный контроль над ключами, значениями и TTL.

@Service
public class CacheService {

    private final RedisTemplate<String, String> redisTemplate;

    public CacheService(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void save(String key, String value, long ttlSeconds) {
        redisTemplate.opsForValue().set(key, value, Duration.ofSeconds(ttlSeconds));
    }

    public String load(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

Автоматическое кэширование через @Cacheable

Для кэширования результатов методов Spring предлагает аннотации — подключать Redis вручную не нужно.

@Service
public class ProductService {

    // Результат метода сохранится в Redis с ключом "products::<id>"
    @Cacheable(value = "products", key = "#id")
    public Product findById(Long id) {
        // вызывается только при отсутствии в кэше
        return productRepository.findById(id).orElseThrow();
    }

    // При обновлении — сбросить кэш для этого ключа
    @CacheEvict(value = "products", key = "#product.id")
    public void update(Product product) {
        productRepository.save(product);
    }
}

Чтобы @Cacheable знал о Redis, добавьте в конфигурацию:

@Configuration
@EnableCaching
public class CacheConfig {
}

Коротко

  • Redis — in-memory хранилище «ключ — значение»; работает быстро за счёт памяти и однопоточной обработки команд.
  • Подходит для кэша, сессий, счётчиков, очередей и rate limiting.
  • Не заменяет основную базу данных: данные без персистентности живут только пока запущен процесс.
  • Основные команды: SET / GET / DEL / EXISTS / EXPIRE / TTL / SETNX.
  • TTL — время жизни ключа; Redis удаляет его автоматически по истечении.
  • В Spring Boot подключается через spring-boot-starter-data-redis (Lettuce); для кэширования — @Cacheable / @CacheEvict.

Что почитать дальше

  • Структуры данных Redis — строки, списки, множества, хэши, сортированные множества и когда что выбрать.
  • Паттерны кэширования — cache-aside, read-through, write-through: как строить кэш правильно и когда сбрасывать.
  • Redis и Spring Boot — глубокое погружение в RedisTemplate, сериализацию, Pub/Sub и управление сессиями.