Один JSR107 (ниже будет конкретная демонстрация кода Springboot)
Java Caching определяет пять основных интерфейсов, а именно CachingProvider, CacheManager, Cache, Entry и Expiry.
-
1 CachingProvider определяет создание, настройку, получение, управление и контроль нескольких CacheManager. Приложение может получить доступ к нескольким CachingProviders во время выполнения.
-
2 CACHEANAGER Определяет создание, конфигурацию, приобретение, управление и управление несколькими однозначными названными кэшами, которые существуют в контексте Cachemanager. Cachemanager принадлежит только одному CachingProvider.
-
3 Кэш представляет собой структуру данных, похожую на карту, и временно хранит значения, индексированные по ключу. Кэш принадлежит только одному CacheManager.
-
4 Запись — это пара ключ-значение, хранящаяся в кэше.
-
5 Срок действия Каждая запись, хранящаяся в кэше, имеет определенный срок действия. По истечении этого времени запись становится просроченной. По истечении этого срока запись будет недоступна, обновлена и удалена. Срок действия кеша можно установить через ExpiryPolicy.
Как показано ниже:
Две абстракции кэша Spring (ниже будет показана конкретная демонстрация кода Springboot)
Упростите разработку с помощью аннотаций
-
1 Интерфейс Cache определен для спецификации компонентов кэша, включая различные наборы операций кэша;
-
2 Под интерфейсом Cache Spring предоставляет различные реализации xxxCache, такие как RedisCache, EhCacheCache, ConcurrentMapCache и т. д. Каждый раз, когда вызывается метод, требующий функции кэширования, Spring проверяет, был ли вызван указанный целевой метод указанного параметра; Получить результат вызова метода напрямую из кеша, если нет, то вызвать метод и закешировать результат и вернуть его пользователю. Получите его прямо из тайника в следующий раз.
-
3 При использовании абстракции кэша Spring нам нужно обратить внимание на следующие два момента:
Первый момент — определить методы, которые нужно кэшировать, и стратегию их кэширования, а второй — прочитать ранее кэшированные данные из кэша.
Три кэш-аннотации
разное
-
@CAMEABLES может кэшировать результаты метода на основе его параметров запроса;
cacheNames Имя кеша, то есть в кеше есть имя emp для идентификации различных компонентов кеша.
@Cacheable(cacheNames = {"emp"})
public Employee getEmpById(Integer id){
System.out.println("查询" + id + "号员工");
Employee employee = emploeeMapper.getEmpById(id);
return employee;
}
- @CachePut синхронно обновляет кеш
// @CachePut: 既调用方法,又更新缓存数据;同步更新缓存
// 修改了数据库的某个数据,同时更新缓存
// 运行:
// 1.先调用目标方法
// 2.将目标方法的结果缓存起来
@CachePut(key = "#result.id")
public Employee updateEmp(Employee employee){
System.out.println("updateEmp "+employee);
emploeeMapper.updateEmpById(employee);
return employee;
}
- @CacheEvict очистка кеша
// @CacheEvict:缓存清除
// key:指定要清除的数据
// allEntries = true : 指定清除这个缓存中的所有数据
// beforeInvocation=fales: 缓存的清除是否在方法之前执行
// 默认代表缓存清除操作是在方法执行之后执行;如果出现异常缓存就不会清除
// beforeInvocation=true 代表清除缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除
@CacheEvict(beforeInvocation = true)
public void deleteEmp(Integer id){
System.out.println("delteEmp: " + id);
int i = 101/0;
emploeeMapper.deleteEmpById(id);
}
Здесь есть исключение, потому что есть int i = 101/0, поэтому это ненормально, но не влияет на результат.
Использование кеша SpringBoot и основной адрес: