Ответ
Для управления переполнением кэша используются политики вытеснения (Eviction Policies). Выбор зависит от паттерна доступа к данным.
Основные политики:
- 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; } }; - LFU (Least Frequently Used) — вытесняет наименее часто используемые элементы. Подходит для кэширования с устойчивым паттерном популярности.
- FIFO (First In First Out) — вытесняет самые старые элементы по времени добавления.
Дополнительные механизмы:
- TTL (Time To Live) — автоматическое удаление записей по истечении срока жизни.
- Слабые ссылки (WeakReference) — позволяет сборщику мусора удалять entries при нехватке памяти.
- Динамическое увеличение размера — если позволяет инфраструктура.
Практический совет: В библиотеках (например, Guava Cache, Caffeine, Ehcache) политики вытеснения часто комбинируются с TTL для лучшего контроля.