Кэширование в Java: Redis, Caffeine и другие инструменты

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

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

Начать курс

Кэширование в Java: Redis и другие решения

Кэширование — одна из ключевых техник оптимизации производительности в Java-приложениях. Оно позволяет сократить время ответа, снизить нагрузку на базы данных и внешние API. В этой статье мы разберём популярные инструменты кэширования: Redis, Caffeine, Ehcache и встроенные средства Spring Cache.

Зачем нужно кэширование в Java?

Без кэша каждое обращение к данным может вызывать дорогостоящие операции: запросы к SQL, вызовы REST API или сложные вычисления. Кэш хранит результаты этих операций в быстром доступе (оперативная память или распределённое хранилище), что даёт:

  • Уменьшение времени отклика (latency)
  • Снижение нагрузки на бэкенд
  • Экономию ресурсов сервера
  • Масштабируемость при высоких нагрузках

1. Redis — распределённое кэширование

Redis — это in-memory хранилище данных, которое часто используется как распределённый кэш. Он поддерживает сложные структуры данных: строки, списки, множества, хэши и сортированные множества. Для Java существует популярный клиент Jedis и более современный Lettuce.

Подключение Redis через Jedis

Добавьте зависимость в pom.xml:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>5.0.2</version>
</dependency>

Пример работы с кэшем Redis:

import redis.clients.jedis.Jedis;

public class RedisCacheExample {
    public static void main(String[] args) {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // Сохраняем данные с TTL (время жизни)
            jedis.setex("user:123", 3600, "{\"name\":\"Иван\",\"age\":30}");

            // Читаем из кэша
            String cachedUser = jedis.get("user:123");
            System.out.println("Из кэша: " + cachedUser);

            // Проверяем существование ключа
            if (jedis.exists("user:123")) {
                System.out.println("Ключ существует");
            }
        }
    }
}

Плюсы Redis: распределённость, персистентность, поддержка TTL, pub/sub, кластеризация. Минусы: требует отдельного сервера, сериализация объектов.

2. Caffeine — высокопроизводительный локальный кэш

Caffeine — современная библиотека для in-memory кэширования на Java. Она основана на алгоритме W-TinyLFU, который обеспечивает высокую эффективность при низком потреблении памяти. Caffeine часто используется в Spring Boot 2.x и 3.x как стандартный кэш.

Пример с Caffeine

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

public class CaffeineCacheExample {
    public static void main(String[] args) {
        Cache<String, String> cache = Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .maximumSize(10_000)
                .recordStats()
                .build();

        // Запись
        cache.put("product:42", "Ноутбук Dell XPS 15");

        // Чтение с fallback
        String product = cache.get("product:42", key -> loadFromDB(key));
        System.out.println("Товар: " + product);

        // Статистика
        System.out.println("Попадания: " + cache.stats().hitCount());
    }

    private static String loadFromDB(String key) {
        // Имитация загрузки из БД
        return "Товар по ключу " + key;
    }
}

Плюсы Caffeine: высокая скорость, автоматическая эвикция, статистика, интеграция со Spring. Минусы: только локальный (не распределённый).

3. Ehcache — зрелый локальный кэш

Ehcache — одна из старейших Java-библиотек для кэширования. Поддерживает кэширование на диске, кластеризацию через Terracotta и JTA-транзакции. В версии 3.x получил современный API.

Пример с Ehcache 3

import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.expiry.Duration;
import org.ehcache.expiry.Expirations;

import java.util.concurrent.TimeUnit;

public class EhcacheExample {
    public static void main(String[] args) {
        CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
                .withCache("myCache",
                        CacheConfigurationBuilder.newCacheConfigurationBuilder(
                                        String.class                    

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