Ответ
Задача: проектирование и реализация двухуровневой системы динамического кэширования для высоконагруженного REST API, чтобы снизить нагрузку на базу данных и уменьшить latency.
Проблема: Прямые запросы к БД на пиковых нагрузках создавали задержки и риск её перегрузки.
Решение: Архитектура «Локальный кэш (Caffeine) → Распределенный кэш (Redis) → База данных».
Ключевые компоненты реализации на Spring Boot:
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
// 1. Локальный кэш (быстрый, небольшой объем)
Cache localCache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.SECONDS)
.maximumSize(1000)
.build();
// 2. Распределенный кэш (общий для всех инстансов)
RedisCacheConfiguration redisConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(5))
.serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(redisConfig)
.build();
// 3. Объединение в TieredCacheManager (собственная или сторонняя реализация)
// Логика: запрос сначала идет в Caffeine, затем в Redis, и только потом в БД.
return new TieredCacheManager(localCache, redisCacheManager);
}
}
Результат:
- Снижение нагрузки на БД на ~40%.
- Ускорение обработки 95% запросов в 3-5 раз за счет попадания в локальный кэш.
- Обеспечение консистентности данных между несколькими экземплярами приложения через Redis.