Spring Boot 缓存示例

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(302)   2023-06-26 07:54:18

在此 Spring boot 教程 中,学习使用其内置支持来管理应用程序缓存。大多数缓存功能都是自动配置的,需要很少或不需要配置。

缓存是一种提高系统性能的机制。它是位于应用程序和持久数据库之间的临时内存。缓存内存存储最近使用的数据项,以尽可能减少数据库命中次数。

1.专家

包括最新版本的 spring-boot-starter-cache 可传递地包括 spring-context-support spring-context 模块的依赖项。两个上下文模块都提供了处理缓存功能所需的类和接口。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2.启用缓存

要启用缓存,请在任何 @Configuration 类上使用 @EnableCaching 注释。

@Configuration
@EnableCaching
public class CacheConfig {
  ...
}

如果我们想在任何环境中禁用缓存,请使用 spring.cache.type 属性。

spring.cache.type=none

3.配置缓存提供者

Spring Boot 需要一个底层的缓存提供程序,它可以存储和管理缓存的对象并支持查找。如果这些提供程序存在于类路径中并且我们已通过 @EnableCaching 启用了缓存,则 Spring Boot 会使用默认选项自动配置这些提供程序之一。

  • JCache (JSR-107)(EhCache 3、Hazelcast、Infinispan 等)
  • EhCache(示例
  • 淡褐色
  • 无穷无尽
  • 沙发床
  • Redis
  • 咖啡因(示例
  • 简单缓存

要自定义上述任何提供程序的配置,我们可以将相应的配置文件放在 /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;
  }
}

4. 缓存注解

启用缓存后,我们可以使用以下缓存注解从缓存中添加和驱逐对象:

  • @Cacheable:触发缓存填充。
  • @CacheEvict:触发缓存逐出。
  • @CachePut:在不干扰方法执行的情况下更新缓存。
  • @Caching:将多个缓存操作重新分组以应用于一个方法。
  • @CacheConfig:在类级别共享一些与缓存相关的标准设置。

请注意,我们也可以通过 XML 配置实现类似的功能,但不再推荐这样做。

4.1. @Cacheable

它用于方法级别,让 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) {...}

4.2. @CachePut

@CachePut 注释与@Cacheable 注释非常相似,只是无论缓存键是否存在于缓存中,被注释的方法总是被执行。它支持与 @Cacheable 相同的选项。

@CachePut(cacheNames = "employees", key = "#employee.id")
public Employee updateEmployee(Employee employee) {...}

4.3. @CacheEvict

此注释有助于驱逐(删除)先前加载的缓存。当执行@CacheEvict 注解的方法时,它将清除与缓存名称、缓存键或要指定的条件匹配的缓存。

@CacheEvict(cacheNames="employees", key="#id") 
public void deleteEmployee(Long id) {...}

@CacheEvict 注释提供了一个额外的参数 ‘allEntries’ 用于逐出整个指定的缓存,而不是缓存中的键。

@CacheEvict(cacheNames="employees", allEntries=true) 
public void deleteAllEmployees() {...}

4.4. @缓存

当我们需要在一个方法中使用多个缓存注解时,需要使用@Caching 注解来对多个注解进行分组。在下面的示例中,我们两次使用了 @CacheEvict 注释。

@Caching(evict = {
    @CacheEvict(cacheNames = "departments", allEntries = true), 
    @CacheEvict(cacheNames = "employees", key = "...")})
public boolean importEmployees(List<Employee> data) { ... }

4.5. @CacheConfig

这个注释允许我们在类级别指定一些缓存配置,因此我们不必在每个方法上重复多次。

@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。您的下一步是配置其他支持的缓存引擎,如 RedisEhcache 等。

快乐学习!!

地址:https://www.cundage.com/article/spring-boot-cache-example.html

相关阅读

在此 Spring boot 教程 中,学习使用其内置支持来管理应用程序缓存。大多数缓存功能都是自动配置的,需要很少或不需要配置。 缓存是一种提高系统性能的机制。它是位于应用程序和持久数据库之间...
之前我们使用 spring 提供的默认缓存管理器开始使用 Spring Cache 抽象。 虽然这种方法可能适合我们对简单应用程序的需求,但在遇到复杂问题时,我们需要使用具有更多功能的不同工具。...
学习编写 spring boot async rest controller,它支持异步请求处理并使用 Callable 接口返回响应。 1. spring boot异步控制器 编写控制器并让它...
学习Spring Boot有以下深度教程,涵盖从基本概念到打包、部署、监控等高级概念。 1. 开始 Spring Boot 简介 spring-boot-starter-parent 示例 sp...
在spring boot中登录非常灵活,易于配置。 Spring Boot 通过简单的配置支持各种日志记录提供程序。在本教程中,我们将了解 Spring boot 支持的各种日志记录选项和配置。...
为了在 spring boot 中安排作业 应用程序定期运行,spring boot 提供了 @EnableScheduling 和 @Scheduled 注释。让我们学习使用 Spring b...
在 的帮助下学习在 Spring boot 2 应用程序中使用 Junit 5 编写单元测试RestTemplate,用于测试 REST API 或 spring mvc 应用程序。 1.Mav...
学习在通过网络访问 rest api 时向 Spring RestTemplate 调用的 http 请求添加基本身份验证。 1.Maven依赖 要使用 Spring RestTemplate ...
默认情况下,Spring boot 应用程序以嵌入式 tomcat 服务器启动,启动于默认端口 8080。我们可以使用以下任何一种技术将默认嵌入式服务器端口更改为任何其他端口。 提示 – 要扫描...
CORS(跨源资源共享)允许网页从其他域向浏览器请求额外资源,例如使用 AJAX 的 API 数据、字体文件、样式表等。我们需要 CORS,因为现代浏览器通常具有 同源安全策略(浏览器禁止AJA...