Кэширование в Java: Redis, Ehcache, Caffeine, Hazelcast — обзор и примеры

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

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

Начать курс

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

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

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

Без кэша каждый запрос к данным приводит к чтению из медленного хранилища (БД, внешний API). Кэш хранит часто запрашиваемые данные в быстрой памяти (in-process или in-memory), что даёт:

  • Ускорение доступа в 10–100 раз
  • Снижение нагрузки на БД
  • Повышение пропускной способности системы
  • Экономию ресурсов

1. Redis — распределённый кэш

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

Пример использования Redis с Jedis

import redis.clients.jedis.Jedis;

public class RedisCacheExample {
    public static void main(String[] args) {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // Устанавливаем значение с TTL 60 секунд
            jedis.setex("user:123", 60, "{\"name\":\"Alice\",\"role\":\"admin\"}");

            // Читаем значение
            String userData = jedis.get("user:123");
            System.out.println("Cached data: " + userData);

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

Плюсы Redis:

  • Поддержка кластеризации и репликации
  • Персистентность (RDB, AOF)
  • Богатый набор команд (INCR, SORT, PUB/SUB)
  • Отличная интеграция со Spring Boot через spring-boot-starter-data-redis

Минусы:

  • Сетевая задержка (отдельный процесс)
  • Требует администрирования
  • Не подходит для кэшей с очень малыми объёмами данных (оверхед подключения)

2. Ehcache — зрелый in-process кэш

Ehcache — одна из старейших библиотек кэширования для Java. Работает внутри JVM, поддерживает дисковое хранение (BigMemory) и полную совместимость с JCache (JSR-107). Идеален для монолитных приложений.

Пример настройки Ehcache через XML

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.ehcache.org/v3"
        xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.10.xsd">
    <cache alias="users">
        <key-type>java.lang.String</key-type>
        <value-type>java.lang.String</value-type>
        <heap>1000</heap>
        <expiry>
            <ttl unit="seconds">300</ttl>
        </expiry>
    </cache>
</config>

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

import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.xml.XmlConfiguration;

public class EhcacheExample {
    public static void main(String[] args) {
        XmlConfiguration xmlConfig = new XmlConfiguration(
            EhcacheExample.class.getResource("/ehcache.xml"));
        try (CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfig)) {
            cacheManager.init();
            Cache<String, String> users = cacheManager.getCache("users", String.class, String.class);
            users.put("user:456", "{\"name\":\"Bob\"}");
            System.out.println(users.get("user:456"));
        }
    }
}

Плюсы Ehcache:

  • Максимальная скорость (без сети)
  • Поддержка дискового хранения (BigMemory)
  • Совместимость с Hibernate (второй уровень кэша)
  • Надёжность и проверенная временем стабильность

Минусы:

  • Не масштабируется горизонтально

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