Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: cache, LRU, memory management, eviction policy, TTL

Как ограничить размер кэша и удалять старые элементы?

Вопрос проверяет понимание стратегий управления памятью в кэше, что необходимо для предотвращения утечек памяти и оптимизации производительности приложений.

Короткий ответ

Размер кэша можно ограничить, задав максимальное количество элементов или общий объём памяти. Для удаления старых элементов используются политики вытеснения, такие как LRU (Least Recently Used), удаляющая давно неиспользуемые данные. Также можно применять TTL (Time To Live), автоматически удаляя записи по истечении срока. Эти подходы часто реализуются в библиотеках (например, lru-cache для Node.js) или встроенных структурах.

Длинный ответ

Кэширование — это техника хранения временных данных для ускорения доступа, но неограниченный рост кэша может привести к исчерпанию памяти. Поэтому необходимо управлять его размером, применяя политики вытеснения (eviction policies).

Основные стратегии ограничения размера

  • Фиксированное количество записей: кэш хранит не более N элементов, при добавлении нового удаляется старый согласно выбранной политике.
  • Ограничение по памяти: отслеживается объём занимаемой памяти (например, в байтах), и при превышении лимита удаляются элементы.
  • TTL (Time To Live): каждой записи присваивается срок жизни, по истечении которого она считается устаревшей и удаляется при следующем обращении или фоновой очистке.

Популярные политики вытеснения

  • LRU (Least Recently Used): удаляет элементы, к которым дольше всего не обращались. Эффективна для шаблонов доступа с временной локальностью.
  • LFU (Least Frequently Used): удаляет реже всего используемые элементы. Подходит для сценариев, где некоторые данные запрашиваются постоянно.
  • FIFO (First-In-First-Out): удаляет элементы в порядке добавления, простая, но не всегда оптимальная.

Пример реализации LRU-кэша на JavaScript

class LRUCache {
  constructor(capacity) {
    this.capacity = capacity;
    this.cache = new Map(); // Хранит ключ-значение
  }

  get(key) {
    if (!this.cache.has(key)) return -1;
    const value = this.cache.get(key);
    // Обновляем порядок: удаляем и вставляем заново
    this.cache.delete(key);
    this.cache.set(key, value);
    return value;
  }

  put(key, value) {
    if (this.cache.has(key)) {
      this.cache.delete(key);
    } else if (this.cache.size >= this.capacity) {
      // Удаляем самый старый элемент (первый в Map)
      const oldestKey = this.cache.keys().next().value;
      this.cache.delete(oldestKey);
    }
    this.cache.set(key, value);
  }
}

// Использование
const cache = new LRUCache(2);
cache.put('a', 1);
cache.put('b', 2);
console.log(cache.get('a')); // 1 (обновляет порядок)
cache.put('c', 3); // Вытесняет 'b', так как он стал самым старым
console.log(cache.get('b')); // -1 (не найден)

В реальных приложениях часто используют готовые библиотеки, например, lru-cache для Node.js или встроенные механизмы в фреймворках (Redis с политиками вытеснения).

Где применяется

  • Веб-приложения: кэширование ответов API, результатов запросов к БД.
  • Системы баз данных: буферный пул для часто читаемых страниц.
  • Операционные системы: кэширование файлов в памяти.
  • Сетевые прокси: хранение копий веб-страниц для снижения нагрузки.

Вывод: Ограничение размера кэша с политикой вытеснения (особенно LRU) критически важно для долгосрочной стабильности приложений, работающих с большими объёмами временных данных, так как предотвращает утечки памяти и обеспечивает эффективное использование ресурсов.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#cache

#LRU

#memory management

#eviction policy

#TTL

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.