SpringBoot 缓存:初学者指南
微信搜索关注《Java学研大本营》,加入读者群,分享更多精彩
在当今快节奏的软件开发世界中,性能通常是开发人员关注的重点。提高应用程序性能的一种方法是使用缓存。缓存是一种涉及将频繁访问的数据存储在内存或其他缓存技术中的技术,从而减少从外部源检索数据所需的时间。
Spring Boot是一种基于Java 的流行框架,用于构建 Web 应用程序,它通过 Spring Framework 的缓存抽象提供对缓存的支持。
在本文中,我们将仔细研究Spring Boot 缓存,包括它的工作原理以及如何在 Spring Boot 应用程序中配置缓存。
概述
缓存是一个临时存储区域,用于存储经常访问的数据或资源,以加快后续对其的访问。它通常以键值对的形式存储数据。存储在缓存中的每条数据或资源都与一个唯一的键相关联,用于在需要时快速检索数据。
Spring Boot 缓存是 Spring Framework 提供的一项特性,它使开发人员能够将经常访问的数据缓存在内存中或其他缓存技术中。缓存可以通过减少从数据库或其他检索数据所需的时间来帮助提高应用程序性能。
Spring Boot 缓存基于注解的概念。通过向应用程序中需要缓存的方法添加注释,您可以定义缓存行为,例如缓存名称、用于标识被缓存数据的键以及缓存策略。
Spring Boot 中的缓存注解包括:
-
@Cacheable:表示应缓存调用方法的结果。如果使用相同的参数再次调用相同的方法,则返回缓存的值而不是再次调用该方法。
-
@CachePut: 表示应缓存调用方法的结果,但应始终调用该方法。此处特定键的缓存值将使用调用方法返回的新值进行更新。
-
@CacheEvict:表示应从缓存中删除与该方法关联的缓存条目。
执行
让我们看一下Springboot 应用程序中的一个简单缓存实现。
演示项目将包含2 个 REST API,一个使用POST方法注册员工(我们将其存储在内存中的 h2 数据库中),另一个使用GET方法获取具有特定ID的员工。
这个想法是记录实现缓存前后GET API调用的响应时间来比较它们的性能。
下面是springboot应用的目录结构。
目录结构
首先,让我们通过pom.xml文件在我们的 spring-boot 应用程序中添加启用缓存所需的依赖项。
POM 依赖
<dependency> <groupId> org.springframework.boot
</groupId> <artifactId> spring - boot - starter - cache </artifactId> <version> 2.4.0 </version> </dependency> _ _ _ _ _ _ _ _ _ _
让我们看看我们的Employee 类。
员工模型
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import org.hibernate.annotations.GenericGenerator;
@Entity
public class Employee {
@Id
private String id;
private String name;
private String company;
private Integer salary;
//constructors
//getters
//setters
}
接下来,我们有EmployeeRepository和EmployeeService类,它们基本上分别是我们的DAO(数据访问对象)层和服务层。
员工资料库
@Repository
public interface EmployeeRepository extends CrudRepository<Employee, String>{
ArrayList<Employee> findAll();
}
员工服务
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import com.example.springboot.dao.EmployeeRepository;
import com.example.springboot.models.Employee;
@Service
public class EmployeeService {
@Autowired
EmployeeRepository employeeRepository;
public Employee registerEmployee(Employee employee) {
return employeeRepository.save(employee);
}
@Cacheable(value="Employee", key="#id")
public Employee getEmployeeById(String id) {
return employeeRepository.findById(id).get();
}
}
在我们的服务类中,我们可以看到我们已经使用@Cacheable 注解withid作为方法的键getEmployeeById。这表明当第一次getEmployeeById调用该方法时,将执行该方法内部的代码,该代码在内部对h2 数据库进行DB调用以检索其 ID 作为函数参数传递的员工的详细信息。执行完成后,该函数返回的值将存储在缓存中。id(传入函数参数)是缓存的键employeeId并且返回的值getEmployeeById将是相应的值。
employeeId随后,当再次调用与之前传递的相同的函数时,该方法不会被调用,因为该特定键已经存在于缓存中,并且与该键对应的值将直接由缓存本身返回。
接下来,让我们看看我们的Controller 类
员工控制器
@RestController
public class EmployeeController {
@Autowired
EmployeeService employeeService;
@PostMapping("/employee")
public Employee saveBook(@RequestBody Employee employee) {
return employeeService.registerEmployee(employee);
}
@GetMapping("/employee/{id}")
public Employee getBook(@PathVariable("id") String id) {
return employeeService.getEmployeeById(id);
}
}
在这里我们可以看到我们公开了2 个 REST端点。一个用于在 endpoint 的 h2 数据库中注册员工,另一个用于通过endpoint 的id/employee 检索特定员工。缓存是在检索员工详细信息的GET调用上实现的。/employee/{id}
最后,为了使Cache 实现正常工作,我们需要在Springboot Application@EnableCaching 级别添加注解。
@SpringBootApplication
@EnableCaching
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
现在让我们使用命令运行上面的spring boot 应用程序。
mvn springboot: run
测试
spring-boot 应用程序运行后,让我们测试我们的缓存实现。
首先,让我们对端点执行POST调用以注册员工。
接下来,让我们通过 curl 调用使用id获取员工。请参阅此处以记录curl 调用统计信息。
curl -v -w "@curl-format.txt" --location --request GET 'http://localhost:8080/employee/001' | jq '.'
初始 GET 调用响应统计
后续 GET 调用响应统计
第一次执行GET API调用时,我们可以看到响应时间为 0.046 秒(请参阅字段time_total),因为调用了该方法getEmployeeById,因为 Cache 没有被调用的相应键( employeeId)。但是当第二次调用完成时,我们可以看到响应时间是 0.007 秒。这让我们了解到,第一次进行 API 调用时,有一个对H2数据库的DB调用,与响应时间为可以忽略不计,因为从缓存中找到了相应的键,并且从缓存中返回了相应的值。
结论
总之,缓存是提高软件应用程序性能和可伸缩性的重要技术。通过将经常访问的数据存储在内存或其他缓存技术中,缓存可以减少访问数据所需的时间并提高应用程序的整体速度。作为本文的扩展,您可以尝试注释的实现并了解它们的用例。@CachePut@CacheEvict
总的来说,Spring Boot 缓存对于任何希望提高基于 Java 的 Web 应用程序性能的开发人员来说都是一个有价值的工具。通过有效地使用缓存,开发人员可以提供更快、响应更快的应用程序来满足用户的需求。
推荐书单
《Java从入门到精通(第6版)》
《Java从入门到精通(第6版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细讲解了使用Java语言进行程序开发需要掌握的知识。全书分为23章,内容包括初识Java,熟悉Eclipse开发工具,Java语言基础,流程控制,数组,类和对象,继承、多态、抽象类与接口,包和内部类,异常处理,字符串,常用类库,集合类,枚举类型与泛型,lambda表达式与流处理,I/O(输入/输出),反射与注释,数据库操作,Swing程序设计,Java绘图,多线程,网络通信,奔跑吧小恐龙,MR人脸识别打卡系统。书中所有知识都结合具体实例进行讲解,涉及的程序代码都给出了详细的注释,可以使读者轻松领会Java程序开发的精髓,快速提高开发技能。
精彩回顾
微信搜索关注《Java学研大本营》
访问【IT今日热榜】,发现每日技术热点