Gymterview
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 для разных кэшей.