The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Предположим, у вас есть метод, который требует времени для выполнения, и вы хотите закешировать его результат. Существует множество решений, включая Apache Commons JCS, Ehcache, JSR 107, Guava Caching и многие другие.
jcabi-aspects предлагает очень простой способ, основанный на аспектах AOP и аннотациях Java6:
Результат метода load()
будет кэшироваться в памяти в течение пяти минут.
Этот пост об АОП, AspectJ и логировании методов объясняет, как работает “аспектное плетение” (очень рекомендую вам прочитать его первым).
Здесь я объясню, как работает кэширование.
Подход очень простой. Существует статический хэш-мап с ключами в виде “координат метода” и значениями в виде их результатов. Координаты метода состоят из объекта - владельца метода и имени метода с типами параметров.
В приведенном выше примере, сразу после завершения метода load()
, в карту добавляется новая запись (упрощенный пример, конечно).
Каждый последующий вызов load()
будет перехвачен аспектом из jcabi-aspects и немедленно разрешен с помощью значения из кэш-карты. Метод не получит никакого управления до конца его жизненного цикла, который в данном примере составляет пять минут.
Иногда необходимо иметь возможность сбросить кэш до окончания его срока службы. Вот практический пример:
Очевидно, что количество сотрудников в базе данных будет отличаться после выполнения метода add()
, и результат size()
должен быть недействителен в кэше. Эта операция недействительности называется “flushing” (сброс), и @Cacheable.FlushBefore
вызывает ее.
Фактически, каждый вызов add()
недействителен для всех закэшированных методов в этом классе, а не только для size()
.
Также есть @Cacheable.FlushAfter
. Разница заключается в том, что FlushBefore
гарантирует, что кэш уже недействителен, когда метод add()
начинается. FlushAfter
недействителен кэш после завершения метода add()
. Эта небольшая разница имеет большое значение, иногда.
В этой статье объясняется, как добавить jcabi-aspects в ваш проект.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-28 at 14:37