Какие уровни кэширования используются в Java-приложениях?

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

Ответ

В Java-приложениях применяют многоуровневое кэширование для повышения производительности. Основные уровни:

  1. Локальный кэш в памяти (In-Memory Cache)

    • Цель: Максимально быстрый доступ в пределах JVM.
    • Технологии: Caffeine, Guava Cache, ConcurrentHashMap.
    • Пример Caffeine:
      Cache<String, Object> cache = Caffeine.newBuilder()
      .maximumSize(10_000)
      .expireAfterWrite(1, TimeUnit.HOURS)
      .build();
  2. Распределенный кэш (Distributed Cache)

    • Цель: Согласованность данных между узлами кластера.
    • Технологии: Redis, Hazelcast, Memcached.
  3. Кэш уровня базы данных (Database Cache)

    • Цель: Снижение нагрузки на СУБД, уменьшение SQL-запросов.
    • Технологии: Hibernate Second-Level Cache, кэш запросов MyBatis.
  4. Кэш HTTP/браузера (HTTP/Browser Cache)

    • Цель: Кэширование статических ресурсов (CSS, JS, изображения).
    • Механизм: Управляется HTTP-заголовками (Cache-Control, ETag).
  5. Кэш процессора (CPU Cache)

    • Цель: Аппаратное ускорение, управляется JVM и ОС.
    • Оптимизация: Выравнивание данных (padding), использование массивов фиксированного размера.

Практика: Часто используют комбинацию уровней (например, локальный кэш + Redis) для баланса скорости, согласованности и масштабируемости.