Статьи

Способ обхода кэша

Найди свой путь!

В течение десятилетий разработчики и дизайнеры пытались оптимизировать производительность систем и услуг, которые они предоставляют:

  • Операционные системы в поисках самого быстрого времени запуска.
  • Браузеры пытаются превзойти своих конкурентов.
  • API делают свою работу максимально быстро.

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

Вам также может понравиться: Кэширование в Java с политикой исключения LRU

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

Сценарий шрифта

В качестве примера рассмотрим работу в издательской индустрии — создание клиента, который даст конечным пользователям возможность создавать публикуемый контент. Чтобы клиенты могли выполнять свою работу, они будут полагаться на шрифты, которые контролируются приложением.  

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

Несмотря на то, что список шрифтов часто остается статичным после настройки проекта, вероятность того, что каждый проект увидит изменение в списке шрифтов, составляет 20%, что может произойти в любой момент в течение жизненного цикла проекта.

Зная, что полезная нагрузка, связанная с информацией о шрифтах, очень статична, эти данные стали очевидным выбором для кеширования в API.

Вдохновение Рассела

Говоря об этой ситуации с моим коллегой РасселомЯ хочу, чтобы мой код был скучным »), мы добрались до ситуации, когда потребуется устаревший кэш для заданного набора шрифтов, используемых в проекте. Стратегия кеширования, которую мы использовали в Spring Boot, была Ehcache, а концепция удаления кеша была тем подходом, который я планировал использовать.

К тому времени, когда я говорил с Расселом, уже были элементы кэша для заданной полезной нагрузки шрифта по уникальному идентификатору, связанному с каждым шрифтом. Я уже кешировал реальные двоичные файлы шрифтов, которые нужно было распространять каждому клиенту, использующему приложение. В обоих случаях влияние на время отклика было весьма впечатляющим — сокращение от 500 миллисекунд до 10 миллисекунд.

В ранних тестах количество вызовов шрифтов по вызовам API проекта уменьшилось с 1700 миллисекунд до <20 миллисекунд, поскольку требуемые данные подавались непосредственно из кэша. Кэш, который нужно было удалить, как только конфигурация проекта была обновлена.

Рассел сформулировал идею: «что произойдет, если мы не кэшируем шрифты с помощью API проекта, но используем ли этот API вместо существующих кэшей?»

Использование существующего кэша для избежания управления кэшем

Используемый подход иллюстрируется в упрощенном примере исходного кода ниже:


Джава