Кэширование в Java с Caffeine

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое 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).

Рекомендаций