Какие стратегии применяются при достижении предельного размера кэша?

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

Ответ

Для управления переполнением кэша используются политики вытеснения (Eviction Policies). Выбор зависит от паттерна доступа к данным.

Основные политики:

  1. LRU (Least Recently Used) — вытесняет элементы, к которым дольше всего не обращались. Эффективен для большинства сценариев.
    // Реализация на основе LinkedHashMap в Java
    Map<K, V> cache = new LinkedHashMap<K, V>(capacity, 0.75f, true) {
        @Override
        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
            return size() > MAX_CAPACITY;
        }
    };
  2. LFU (Least Frequently Used) — вытесняет наименее часто используемые элементы. Подходит для кэширования с устойчивым паттерном популярности.
  3. FIFO (First In First Out) — вытесняет самые старые элементы по времени добавления.

Дополнительные механизмы:

  • TTL (Time To Live) — автоматическое удаление записей по истечении срока жизни.
  • Слабые ссылки (WeakReference) — позволяет сборщику мусора удалять entries при нехватке памяти.
  • Динамическое увеличение размера — если позволяет инфраструктура.

Практический совет: В библиотеках (например, Guava Cache, Caffeine, Ehcache) политики вытеснения часто комбинируются с TTL для лучшего контроля.