Cache Java Method Results

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

sixnines availability badge   GitHub stars