#caching #design-patterns
#кэширование #шаблоны проектирования
Вопрос:
Я реализовал ExpireLRUCache
класс, который будет очищать данные по истечении времени ожидания. Для этого есть два способа.
- Используйте a
timer
для очистки данных с истекшим сроком действия - Вызовите
clean
функцию вAdd
иGet
Итак, какая реализация лучше?
Ответ №1:
Сделайте самую простую вещь, которая может сработать. Например, предполагая, что ваш кэш имеет фиксированный размер, вызовите clean при добавлении значений. Добавление значений изменяет количество кэшированных элементов, но получение значений — нет. Кроме того, идея кэша заключается в том, что получение выполняется чаще, чем добавление, и вы хотите свести к минимуму количество раз, когда вы вызываете clean . Использование таймера означает потоки и сложность. Докажите, что простейшая реализация не будет работать, прежде чем попробовать что-то более сложное.
Если вы не пишете это как задачу программирования, лучше всего использовать зрелый и популярный кэш, который кто-то уже написал. Есть много мест, где можно ошибиться при реализации кэша. Например, я работаю на Java. Если мне нужен простой кэш, я использую реализацию Guava. Я бы не стал пытаться писать свой собственный кэш.
Наконец, даже если вы пишете это как задачу программирования, я предлагаю найти существующий алгоритм кэширования LRU и реализовать его в коде. Когда это сработает, вы можете изменить код по своему вкусу.