Какие существуют алгоритмы вытеснения (eviction policies) данных из кэша? Назовите их плюсы и минусы.

Ответ

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

  1. LRU (Least Recently Used) — Наиболее давно использованный

    • Принцип: Вытесняется элемент, к которому дольше всего не обращались.
    • Плюсы: Отличный баланс между простотой реализации и эффективностью для большинства сценариев, где недавние данные скорее всего понадобятся снова.
    • Минусы: Уязвим к полным сканированиям (full scan), когда один обход большого объема новых данных может "вымыть" весь полезный кэш.
  2. LFU (Least Frequently Used) — Наименее часто используемый

    • Принцип: Вытесняется элемент, к которому обращались реже всего.
    • Плюсы: Эффективен, если частота доступа к данным сильно неравномерна и есть явные "хиты".
    • Минусы: Сложнее в реализации (требует счетчиков обращений). Может долго хранить старые, но когда-то популярные элементы, которые больше не актуальны.
  3. FIFO (First-In, First-Out) — Первым пришел, первым ушел

    • Принцип: Вытесняется самый старый элемент, независимо от частоты или давности доступа. Простая очередь.
    • Плюсы: Очень прост в реализации.
    • Минусы: Обычно наименее эффективный, так как совершенно не учитывает паттерны доступа.
  4. ARC (Adaptive Replacement Cache) — Адаптивный кэш замены

    • Принцип: Сложный самообучающийся гибрид LRU и LFU, который динамически подстраивается под нагрузку, отслеживая как частоту, так и давность обращений.
    • Плюсы: Показывает одну из лучших производительностей в смешанных типах нагрузки.
    • Минусы: Значительно сложнее в реализации, может быть запатентован (что стоит учитывать).
  5. TTL (Time-To-Live) / TTI (Time-To-Idle) — Время жизни / Время простоя

    • Принцип: Элементы удаляются не из-за заполнения кэша, а по истечении заданного времени жизни (TTL) или времени без обращений (TTI).
    • Нюанс: Часто используется не как основная, а как дополнительная политика в комбинации с LRU/LFU для данных, которые быстро теряют актуальность.
  6. RR (Random Replacement) — Случайная замена

    • Принцип: Для вытеснения выбирается случайный элемент.
    • Плюсы: Крайне прост в реализации, нет накладных расходов на отслеживание метаданных.
    • Минусы: Непредсказуем, может вытеснить очень "горячие" и нужные данные.