Gymterview
middle

Что такое Caffeine Cache?

Caffeine — это высокопроизводительная in-process кэш-библиотека для Java, являющаяся современной заменой Guava Cache и использующая алгоритм Window TinyLFU для достижения near-optimal hit rate.

Создание и использование кэша

Пример
// Создание кэша
Cache<Long, User> cache = Caffeine.newBuilder()
    .maximumSize(10_000)                          // макс. элементов
    .expireAfterWrite(Duration.ofMinutes(10))     // TTL после записи
    .expireAfterAccess(Duration.ofMinutes(5))     // TTL после последнего доступа
    .recordStats()                                 // включить метрики
    .build();

// Ручное использование
cache.put(1L, user);
User cached = cache.getIfPresent(1L);      // null если отсутствует
User loaded = cache.get(1L, id -> loadFromDb(id)); // загрузить при промахе

LoadingCache — автоматическая загрузка

Пример
LoadingCache<Long, User> loadingCache = Caffeine.newBuilder()
    .maximumSize(10_000)
    .expireAfterWrite(Duration.ofMinutes(10))
    .refreshAfterWrite(Duration.ofMinutes(8))     // фоновое обновление
    .build(id -> userRepository.findById(id).orElseThrow());

User user = loadingCache.get(1L); // при промахе — автоматически загрузит из БД

Caffeine как Spring CacheManager

Пример
@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        CaffeineCacheManager manager = new CaffeineCacheManager();
        manager.setCaffeine(Caffeine.newBuilder()
            .maximumSize(5_000)
            .expireAfterWrite(Duration.ofMinutes(10))
            .recordStats());
        return manager;
    }
}

Мониторинг

Пример
CacheStats stats = cache.stats();
stats.hitRate();       // процент попаданий
stats.missRate();      // процент промахов
stats.evictionCount(); // количество вытесненных элементов
stats.loadCount();     // количество загрузок

Caffeine vs Guava Cache vs ConcurrentHashMap

Характеристика Caffeine Guava Cache ConcurrentHashMap
Алгоритм вытеснения W-TinyLFU (near-optimal) LRU Нет (ручное управление)
TTL Да (expireAfter*) Да Нет
Автозагрузка LoadingCache LoadingCache Нет
Статистика Да (recordStats) Да Нет
Refresh refreshAfterWrite refreshAfterWrite Нет
Производительность Высокая (concurrent) Средняя Высокая (без eviction)

Ключевые принципы

  • Caffeine использует алгоритм Window TinyLFU — лучший hit rate среди in-process кэшей (лучше LRU)
  • recordStats() — обязательно для production; без метрик невозможно оценить эффективность
  • refreshAfterWrite — ключ к предотвращению cache stampede для горячих данных
  • Caffeine — замена Guava Cache и ConcurrentHashMap-based кэшей

Частые ошибки

  • Не ограничить maximumSize — кэш растёт бесконечно, приводя к OOM
  • expireAfterWrite + expireAfterAccess одновременно — данные удаляются по первому наступившему условию; обычно достаточно одного
  • Caffeine в микросервисах без L2 — каждый экземпляр имеет свой кэш; при обновлении данные рассинхронизируются

Как используется в 2026

  • Caffeine — стандартный in-process кэш в Spring экосистеме
  • Spring Boot: spring.cache.type=caffeine — одна строка конфига
  • Caffeine + Micrometer — автоматический экспорт метрик в Prometheus/Grafana

На собеседовании: интервьюер хочет услышать про алгоритм W-TinyLFU и почему Caffeine лучше Guava Cache. Частая ошибка — не знать про refreshAfterWrite и recordStats().