Технология кеширования Spring Cache, использование аннотаций Cacheable, CachePut, CacheEvict, Caching, CacheConfig

Необходимые знания:

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

шаг:

1. Включите кэширование на основе аннотаций

Добавьте аннотацию @EnabeleCaching в класс запуска или другие классы конфигурации.

@SpringBootApplication
@MapperScan("com.xj.springboot.mapper")
@EnableCaching
 открытый класс SpringbootCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootCacheApplication.class, аргументы);
    }

}

2. Отметьте аннотацию кеша на методе

1.@Кэшируемый

Эту аннотацию можно пометить в методе. Когда метод, помеченный аннотацией @Cacheable, вызывается в первый раз, аннотация сохранит возвращаемое значение метода как значение в кеше. Если ключ не указан, по умолчанию значением ключа является фактическое значение параметра метода (обратите внимание, что это не формальный параметр). Затем снова вызовите этот метод, переданные параметры такие же, как и в прошлый раз, код в теле метода не будет выполняться, а данные будут напрямую извлечены из кеша, а затем возвращены.

В кэшируемой аннотации есть 9 атрибутов: значение, cacheNames, ключ, генератор ключей, cacheManager, cacheResolver, условие, если, синхронизация. Среди них value и cacheNames являются псевдонимами друг для друга, поэтому можно сказать, что атрибутов всего 8.

  • value / cacheNames: используется для указания имени кеша, это свойство является типом массива, вы можете указать имена нескольких кешей. Этот атрибут должен быть указан, и если он не установлен, будет сообщено об ошибке.
  • ключ: используется для указания ключа данных, хранящихся в кеше (поскольку возвращаемое значение текущего метода должно храниться в кеше в виде ключ-значение), если не задано, по умолчанию используется значение фактического параметр входящего метода (обратите внимание, что это не ссылка на форму), если вы хотите установить его, вы обычно используете выражение spEL (spEL может ссылаться на рисунок ниже ) .

    Примечание. #result нельзя использовать в ключевом атрибуте аннотации @Cacheable для получения возвращаемого значения после выполнения метода, поскольку аннотация @Cacheable сначала ищется в кеше. значение перед выполнением метода.

                

  • keyGenerator: генератор, используемый для указания ключа. Обратите внимание, что одновременно могут существовать только один keyGenerator и key.Если ключ установлен, keyGenerator нельзя установить снова.

  •  cacheManager: указывает, какой CacheManager (менеджер кеша) использовать. Автоматическая конфигурация Springboot добавляет в контейнер cacheManager типа ConcurrentMapCacheManager.Если мы не укажем cacheManager, он будет использовать ConcurrentMapCacheManager, предоставленный Springboot по умолчанию.
  • cacheResolver: то же, что и cacheManager.
  • условие: используется для указания выражения, когда выражение истинно, возвращаемое значение метода помещается в кеш. Выражения обычно записываются как выражения spEL.
  • если: Эффект противоположен атрибуту условия. Укажите выражение, когда выражение истинно, возвращаемое значение метода не будет помещено в кеш. Одно из отличий от условия заключается в том, что в выражении «если» возвращаемое значение метода может быть получено для суждения.
  • sync: использовать ли асинхронный режим. Если вы установите для этой аннотации значение true (то есть включите асинхронный режим), атрибут «если» использовать нельзя. Это свойство может быть включено, когда одновременно работают несколько потоков.

Краткое описание процесса выполнения:

 Перед вызовом метода он сначала возьмет имя, указанное в атрибуте cacheNames в аннотации, чтобы проверить, есть ли в кеше кеш с таким именем, и, если есть, он напрямую вернет данные, ключ которых является фактическим параметром метод. Если нет, то создайте кеш с именем, указанным в атрибуте cacheNames, затем выполните тело метода и поместите возвращаемый результат метода в качестве значения в кеш.

2. @CachePut

Эта аннотация может быть отмечена в методе.Когда метод, отмеченный аннотацией @Cacheput, вызывается каждый раз, аннотация будет хранить возвращаемое значение метода как значение в кеше. Обычно он отмечается на методе, выполняющем операцию обновления базы данных.

Разница между аннотациями CachePut и Cacheable: Cacheable поместит возвращаемое значение метода в кеш только при первом вызове метода, а тело метода не будет выполняться, если оно находится в кеше при повторном вызове. И CachePut помещает возвращаемое значение метода в кеш каждый раз, когда вызывает метод.

В аннотации cachePut есть 9 атрибутов, которые совпадают с атрибутами аннотации Cacheable.

3.CacheEvict

Evict in cacheevict означает изгнание, выселение. Итак, эта аннотация используется для удаления данных указанного ключа в кеше. Эта аннотация может быть помечена на методе.При вызове метода, отмеченного аннотацией @CacheEvict, аннотация найдет значение, соответствующее ключу в кеше по ключу, указанному атрибутом ключа в аннотации Cacheevict, а затем удали это.

Аннотация Cacheevict имеет 9 атрибутов: value, cacheNames, key, keyGenerator, cacheManager, cacheResolver, condition, allEntries, beforeInvocation. Среди них первые 7 атрибутов такие же, как атрибуты в @Cacheable, поэтому я не буду вдаваться в подробности ниже, а представлю только allEntries и beforeInvocation

  • allEntries: Когда для allEntries установлено значение true, это означает, что вызов метода, отмеченного текущей аннотацией, очистит все кэшированные данные в кеше, указанном cacheNames . Значение по умолчанию — ложь
  • beforeInvocation: если для параметра beforeInvocation задано значение true, действие по очистке кэшированных данных будет выполнено до вызова метода. Значение по умолчанию — false, то есть сначала вызывается метод, выполняется содержимое в методе и, наконец, выполняется действие по очистке кэшированных данных. Возможно, вам все еще интересно, в чем польза от beforeInvocation и в чем разница между действием по очистке кэшированных данных до вызова метода и после вызова метода. Ответ однозначно другой. Разница в том, что если действие по очистке кешированных данных выполняется после вызова метода, то метод будет выполняться первым. данные не будут выполняться снова. Действие очистки кэшированных данных выполняется до вызова метода, поэтому действие очистки кэшированных данных будет выполняться независимо от того, будет ли метод ненормальным или нет.

4.@Кэширование

Начало этой аннотации представляет собой комбинацию трех аннотаций Cacheable, CachePut и CacheEvict. Эта аннотация подходит для кэширования сложных методов. Ниже приведен исходный код аннотации Caching.

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Унаследовано
@Документировано
общественное @interface кэширование {
    Cacheable[] cacheable() по умолчанию {};

    CachePut[] put() по умолчанию {};

    CacheEvict[] evict() по умолчанию {};
}

5.@КэшКонфиг

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

Если три аннотации Cacheable, CachePut и CacheEvict для всех методов в классе имеют cacheNames, указывающие на один и тот же или один и тот же пакет кэшей, вы можете использовать @CacheConfig для аннотирования этих cacheNames, а затем пометить эту аннотацию в классе. . Тогда нет необходимости указывать атрибут cacheNames для методов, связанных с кешем, в этом классе, и будут использоваться cacheNames, указанные в CacheConfig.

Supongo que te gusta

Origin blog.csdn.net/listeningdu/article/details/128803392
Recomendado
Clasificación