Что такое Caffeine?
Caffeine — это высокопроизводительная библиотека для кэширования на языке Java, разработанная с учётом современных требований к скорости и эффективности. Она предоставляет in-memory кэш с поддержкой асинхронных операций, автоматической эвакуации записей по времени или размеру, а также настраиваемыми политиками вытеснения (например, на основе частоты использования). Библиотека полностью совместима с Java 8 и выше, и активно используется в крупных проектах, таких как Spring Framework (через Spring Cache).
Зачем нужна?
Кэширование позволяет сократить время доступа к данным, уменьшить нагрузку на базы данных или внешние API, и повысить отзывчивость приложения. Caffeine решает эти задачи с минимальным оверхедом: он обеспечивает субмикросекундные задержки для чтения и записи, автоматически управляет памятью и позволяет гибко настраивать кэш под конкретные бизнес-требования. Без него вам пришлось бы реализовывать кэш вручную с помощью HashMap и таймеров, что сложно и ненадёжно.
Установка
Добавьте зависимость в ваш файл pom.xml (Maven):
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.1.8</version>
</dependency>Для Gradle:
implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'Основные функции
- Автоматическая эвакуация: удаление записей по времени жизни (expireAfterWrite, expireAfterAccess) или по размеру (maximumSize, maximumWeight).
- Асинхронная загрузка: через AsyncCache или методы loadingCache с поддержкой CompletableFuture.
- Статистика: сбор метрик (hit rate, miss rate, evictions) для мониторинга.
- Политики вытеснения: по умолчанию используется Window TinyLFU (адаптивный алгоритм, близкий к оптимальному).
- Null-безопасность: корректная обработка null значений.
Пример кода на Java
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;
public class CaffeineExample {
public static void main(String[] args) {
Cache<String, String> cache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(100)
.recordStats()
.build();
// Запись в кэш
cache.put("user:123", "Alice");
// Чтение с автоматической загрузкой
String user = cache.get("user:456", key -> fetchFromDatabase(key));
System.out.println(user); // null или результат fetch
// Статистика
System.out.println(cache.stats().hitRate());
}
private static String fetchFromDatabase(String key) {
return "Bob"; // Имитация запроса к БД
}
}Когда использовать
Caffeine идеально подходит для кэширования результатов вызовов API, данных из базы данных, вычислений или любых операций, которые выполняются часто и с высокой стоимостью. Используйте его в веб-приложениях, микросервисах, ETL-процессах или в любом Java-проекте, где требуется быстрый и надёжный кэш. Избегайте Caffeine, если вам нужно распределённое кэширование (тогда смотрите в сторону Redis или Hazelcast).