Представьте: каждый запрос на главную страницу заново читает одни и те же данные из базы. Пока пользователей немного — терпимо. Но чем больше запросов, тем дольше ждёт каждый. 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 и управление сессиями.