在此 Spring boot 教程 中,学习使用其内置支持来管理应用程序缓存。大多数缓存功能都是自动配置的,需要很少或不需要配置。
缓存是一种提高系统性能的机制。它是位于应用程序和持久数据库之间的临时内存。缓存内存存储最近使用的数据项,以尽可能减少数据库命中次数。
包括最新版本的 spring-boot-starter-cache 可传递地包括 spring-context-support 和 spring-context 模块的依赖项。两个上下文模块都提供了处理缓存功能所需的类和接口。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
要启用缓存,请在任何 @Configuration 类上使用 @EnableCaching 注释。
@Configuration
@EnableCaching
public class CacheConfig {
...
}
如果我们想在任何环境中禁用缓存,请使用 spring.cache.type 属性。
spring.cache.type=none
Spring Boot 需要一个底层的缓存提供程序,它可以存储和管理缓存的对象并支持查找。如果这些提供程序存在于类路径中并且我们已通过 @EnableCaching
启用了缓存,则 Spring Boot 会使用默认选项自动配置这些提供程序之一。
要自定义上述任何提供程序的配置,我们可以将相应的配置文件放在 /resources 文件夹中,并将配置位置提供给 Spring boot。例如,要自定义 Infinispan,请将自定义配置放在 infinispan.xml 中,并在 application.properties 中提供配置位置。
spring.cache.infinispan.config=infinispan.xml
更详细的信息,我们可以看官方的spring boot文档">这里。
如果未找到任何缓存提供程序,默认情况下,将使用 ConcurrentHashMap
作为缓存存储配置一个简单的实现。 如果需要,我们可以通过编程方式配置 ConcurrentMapCacheManager bean。
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
ConcurrentMapCacheManager mgr = new ConcurrentMapCacheManager();
mgr.setCacheNames(asList("employees"));
return mgr;
}
}
启用缓存后,我们可以使用以下缓存注解从缓存中添加和驱逐对象:
@Cacheable
:触发缓存填充。@CacheEvict
:触发缓存逐出。@CachePut
:在不干扰方法执行的情况下更新缓存。@Caching
:将多个缓存操作重新分组以应用于一个方法。@CacheConfig
:在类级别共享一些与缓存相关的标准设置。请注意,我们也可以通过 XML 配置实现类似的功能,但不再推荐这样做。
它用于方法级别,让 spring 知道该方法的响应是可缓存的。 Spring 拦截此方法的请求/响应,并通过注释属性中指定的名称将响应存储在缓存中,例如@Cacheable(“员工”)。
@Cacheable("employees")
public Optional<Employee> getEmployeeById(Long id) {
return repository.findById(id);
}
由于缓存本质上是键值存储,因此缓存方法的每次调用都需要转换为适合缓存访问的键。默认情况下,Spring 使用方法参数来形成缓存键,如下所示:
SimpleKey.EMPTY
。SimpleKey
。非常有必要了解键必须实现有效的hashCode() 和equals() 方法合约 才能正确查找。
@Cacheable(value = "employees", key = "#id")
public Optional<Employee> getEmployeeById(Long id) {...}
@Cacheable(value = "employees", key = "#department.id")
public List<Employee> getEmployeesByDepartmentId(Department department) {...}
我们也可以只在满足特定条件时才进行缓存。在下面的例子中,我们在employee id大于0的时候进行缓存;
@Cacheable(value = "employees", key = "#id", condition="#id > 0")
public Optional<Employee> getEmployeeById(Long id) {...}
@CachePut 注释与@Cacheable 注释非常相似,只是无论缓存键是否存在于缓存中,被注释的方法总是被执行。它支持与 @Cacheable
相同的选项。
@CachePut(cacheNames = "employees", key = "#employee.id")
public Employee updateEmployee(Employee employee) {...}
此注释有助于驱逐(删除)先前加载的缓存。当执行@CacheEvict 注解的方法时,它将清除与缓存名称、缓存键或要指定的条件匹配的缓存。
@CacheEvict(cacheNames="employees", key="#id")
public void deleteEmployee(Long id) {...}
@CacheEvict 注释提供了一个额外的参数 ‘allEntries’ 用于逐出整个指定的缓存,而不是缓存中的键。
@CacheEvict(cacheNames="employees", allEntries=true)
public void deleteAllEmployees() {...}
当我们需要在一个方法中使用多个缓存注解时,需要使用@Caching 注解来对多个注解进行分组。在下面的示例中,我们两次使用了 @CacheEvict 注释。
@Caching(evict = {
@CacheEvict(cacheNames = "departments", allEntries = true),
@CacheEvict(cacheNames = "employees", key = "...")})
public boolean importEmployees(List<Employee> data) { ... }
这个注释允许我们在类级别指定一些缓存配置,因此我们不必在每个方法上重复多次。
@Service
@CacheConfig(cacheNames={"employees"})
public class EmployeeService {
@Autowired
EmployeeRepository repository;
@Cacheable(key = "#id")
public Optional<Employee> getEmployeeById(Long id) { ... }
@CachePut(key = "#employee.id")
public Employee updateEmployee(Employee employee) { ... }
}
在这个 Spring boot 教程中,我们通过示例学习了在 Spring boot 应用程序中启用和配置缓存功能。我们了解了各种与缓存相关的类和注释以及如何有效地使用它们。
在这篇文章中,我们使用了后备缓存提供程序,即后台的 ConcurrentHashMap。您的下一步是配置其他支持的缓存引擎,如 Redis、Ehcache 等。
快乐学习!!
地址:https://www.cundage.com/article/spring-boot-cache-example.html