Каталог статей
1. Предварительная настройка
Сначала W создает проект Springboot и вводит зависимости:
Spring Web, Spring cache, redis, Spring Security.
Настроить application.properties
spring.redis.host=192.168.176.128
spring.redis.port=6379
#给缓存取一个名字,后面会用到
spring.cache.cache-names=yolo
2. Использование кеша
(1) @CacheConfig
Эта аннотация используется в классе для описания имени кеша, используемого всеми методами в классе. Конечно, нет необходимости использовать эту аннотацию и напрямую настраивать имя для конкретной аннотации кеша. Пример кода выглядит следующим образом:
@Service
@CacheConfig(cacheNames = "yolo")
public class UserService {
}
Вы можете видеть, что все кэшированные ключи добавят имя:
(2) @Cacheable
Эта аннотация обычно добавляется к методу запроса, чтобы указать, что возвращаемое значение метода кэшировано.По умолчанию кэшированный ключ является параметром метода, а кешированное значение - возвращаемым значением метода. Пример кода выглядит следующим образом:
@Cacheable(key = "#id")
public User getUserById(Integer id,String username) {
System.out.println("getUserById");
return getUserFromDBById(id);
}
Когда есть несколько параметров, несколько параметров используются в качестве ключа по умолчанию. Если вам нужен только один из параметров в качестве ключа, вы можете @Cacheable
указать ключ с помощью атрибута key в аннотации. Приведенный выше код означает, что только идентификатор используется в качестве кеша. Key, если у вас сложные требования к ключу, вы можете настроить keyGenerator. Конечно, корневой объект предоставляется в Spring Cache, что позволяет добиться некоторых сложных эффектов без определения keyGenerator:
Пример:
@Service
//用来描述该类中所有方法使用的缓存名称
@CacheConfig(cacheNames = "yolo")
public class UserService {
//表示将该方法的返回值缓存起来
@Cacheable
public User getUserById(Integer id) {
System.out.println("getUserById>>>" + id);
User user = new User();
user.setId(id);
return user;
}
}
Тестовый кеш:
Вы можете видеть, что метод был выполнен только один раз, потому что второй вызов не был выполнен, и был использован кешированный результат.
Если параметры, передаваемые вызовом, не совпадают, он будет рассматриваться как два разных вызова:
Когда ключ указан, оценка будет производиться в соответствии с разницей ключа. Если ключ будет одинаковым два раза, он будет вызван только один раз:
Хотя здесь несколько параметров, вы можете указать ключ, например, указав id в качестве ключа:
вы можете видеть, что, хотя переданные параметры отличаются, он вызывается только один раз:
(3) Пользовательский генератор ключей
Если у вас сложные требования к ключу, вы можете настроить keyGenerator
Например, мне нужен ключевой формат:方法名:参数
//自定义 keyGenerator,将返回值当做 key
@Component
public class MyKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object o, Method method, Object... objects) {
//可以根据自己的需求返回 key
return method.getName() + ":" + Arrays.toString(objects);
}
}
Сохраненный ключ:
(4) @CacheEvict
Эта аннотация обычно добавляется к методу удаления. Когда данные в базе данных удаляются, соответствующие кэшированные данные также должны автоматически очищаться. Когда аннотация используется, ее также можно настроить для удаления в соответствии с определенными условиями (атрибут условия) или настроить для очистки всех кешей. (Атрибут AllEntries) пример кода выглядит следующим образом:
@CacheEvict
public void deleteUserById(Integer id) {
System.out.println("deleteUserById>>>" + id);
}
Вы можете видеть, что второй раз кеш не используется, а вызывается снова:
(5) @CachePut
Эта аннотация обычно добавляется к методу обновления. Когда данные в базе данных обновляются, данные в кэше также будут обновлены. Используя эту аннотацию, возвращаемое значение метода может быть автоматически обновлено до существующего ключа. Пример кода выглядит следующим образом:
@CachePut(key = "#user.id")
public User updateUserById(User user) {
return user;
}
Вы можете видеть, что он был вызван только один раз, а кеш использовался напрямую во второй раз, но кеш в это время является обновленным кешем.
Три, резюме
В Spring Boot, используя кеш Redis, вы можете либо использовать RedisTemplate, чтобы реализовать его самостоятельно, либо вы можете использовать этот метод. Этот метод представляет собой унифицированный интерфейс, предоставляемый Spring Cache. Реализация может быть либо Redis, Ehcache, либо другой поддержкой. Стандартизированная структура кеширования. С этой точки зрения отношения между Spring Cache, Redis и Ehcache аналогичны отношениям между JDBC и различными драйверами баз данных.
См. Видео брата Ю.