В каких случаях в Java стоит использовать библиотеку Caffeine?

«В каких случаях в Java стоит использовать библиотеку Caffeine?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Caffeine — это высокопроизводительная in-memory библиотека кэширования для Java. Её стоит использовать, когда требуется максимальная скорость доступа к данным в памяти с гибкой политикой управления кэшем.

Ключевые сценарии использования:

  • Высокая производительность: Алгоритмы Caffeine оптимизированы под современные многоядерные процессоры и часто превосходят ConcurrentHashMap или Guava Cache.
  • Сложные политики истечения срока действия (TTL): Нужны гибкие настройки: по времени после записи/чтения, по размеру, комбинированные.
  • Асинхронное обновление: Возможность асинхронно загружать данные в кэш, не блокируя потоки, ожидающие результат.
  • Статистика: Встроенный сбор статистики хитов/промахов для тонкой настройки.

Пример создания и использования кэша:

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;

// Создание кэша
Cache<String, User> cache = Caffeine.newBuilder()
    .expireAfterWrite(10, TimeUnit.MINUTES) // Записи живут 10 минут
    .maximumSize(1000)                     // Максимум 1000 записей
    .recordStats()                         // Включить сбор статистики
    .build();

// Использование: если ключа нет, вызывается функция для его загрузки
User user = cache.get("user:123", key -> userService.findById(key));

Альтернативы: Для простейшего кэша можно использовать ConcurrentHashMap. Для распределенного кэша между сервисами — Redis или Hazelcast.