middle
Как настроить Redis в Spring Boot?
Настройка Redis в Spring Boot включает подключение зависимостей, конфигурацию соединения в application.yml, создание RedisCacheManager с настройками сериализации и TTL, и использование Spring Cache аннотаций.
Зависимости
Пример
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Конфигурация application.yml
Пример
spring:
data:
redis:
host: ${REDIS_HOST:localhost}
port: ${REDIS_PORT:6379}
password: ${REDIS_PASSWORD:}
cache:
type: redis
redis:
time-to-live: 600000 # 10 минут (мс)
cache-null-values: false # не кэшировать null
key-prefix: "myapp:" # префикс для всех ключей
Java-конфигурация RedisCacheManager
Гибкая настройка TTL по кэшам:
Пример кода
@Configuration
@EnableCaching
public class RedisCacheConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
// Конфигурация по умолчанию
RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10))
.disableCachingNullValues()
.serializeKeysWith(SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(SerializationPair.fromSerializer(
new GenericJackson2JsonRedisSerializer()));
// Разный TTL для разных кэшей
Map<String, RedisCacheConfiguration> cacheConfigs = Map.of(
"users", defaultConfig.entryTtl(Duration.ofMinutes(30)),
"products", defaultConfig.entryTtl(Duration.ofHours(1)),
"sessions", defaultConfig.entryTtl(Duration.ofHours(24))
);
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(defaultConfig)
.withInitialCacheConfigurations(cacheConfigs)
.build();
}
}
Использование через Spring Cache аннотации
Пример
@Service
public class ProductService {
@Cacheable(value = "products", key = "#id")
public Product findById(Long id) {
return productRepository.findById(id).orElseThrow();
}
@CachePut(value = "products", key = "#result.id")
public Product update(Product product) {
return productRepository.save(product);
}
@CacheEvict(value = "products", key = "#id")
public void delete(Long id) {
productRepository.deleteById(id);
}
}
Ключевые моменты
GenericJackson2JsonRedisSerializer— сериализует объекты в JSON (читаемо в Redis CLI)- Разный TTL для разных кэшей — обязательно; справочники живут часами, пользовательские данные — минутами
- Spring Boot auto-configures
LettuceConnectionFactory— Lettuce предпочтительнее Jedis (non-blocking, reactive support)
Частые ошибки
- JDK сериализация (по умолчанию) — нечитаемые бинарные данные в Redis; используйте JSON-сериализатор
- Один TTL для всех кэшей — справочник товаров и токен авторизации требуют разных TTL
- Не указать
disableCachingNullValues()— null кэшируется и возвращается при следующем запросе - Отсутствие key-prefix — при нескольких приложениях на одном Redis ключи конфликтуют
Как используется в 2026
- Spring Boot 3.x + Lettuce — стандартный стек
- Redis Sentinel для HA, Redis Cluster для шардирования
- Testcontainers с
GenericContainer<>("redis:7")для интеграционных тестов
На собеседовании: интервьюер хочет увидеть, что вы настраивали Redis на практике, а не только читали документацию. Частая ошибка — забыть про JSON-сериализацию и разные TTL для разных кэшей.