Spring Boot整合缓存——Ehcache缓存!超详细!
前言
!声明:本文基于“ Spring Boot整合缓存——声明式缓存注解的应用!超详细!”进行拓展。
1、Ehcache概述
Ehcache 是一种开源的缓存框架,它配置简单、结构清晰、功能强大,是当前使用最的基于 Java 语言的缓存之一。Eheache 可以很便捷地与其他流行的库和框架进行集成t中,Hibernate默认的缓存提供者就是Ehcache。
Ehcache 能够成为目前使用最广泛的缓存框架之一,主要得益于它的以下几个特点:快速轻量、伸缩性、灵活性、标准支持、可扩展性、监听器、Java企业级应用缓存、开源协议 Apache License 2.0。
2、项目目录

3、环境配置
JDK:17
IDEA:2025.1
Spring Boot:2.7.6
一、创建项目
在IDEA中创建 Spring Boot 项目 chapter06_Ehcache,大家可以根据自己当前情况选择使用 Spring Initializr 方式或者 Maven方式进行创建,在此选择使用 Maven 方式创建项目。
二、配置依赖
在项目 chapter06_Ehcache 的 pom.xml 文件中配置添加 Ehcache 的依赖,具体代码如下。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.6</version><relativePath/></parent><groupId>org.example</groupId><artifactId>chapter06_Ehcache</artifactId><version>0.0.1-SNAPSHOT</version><name>chapter06_Ehcache</name><description>chapter06_Ehcache</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.4</version></dependency><dependency><groupId>javax.cache</groupId><artifactId>cache-api</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
三、设置配置信息
该项目无需在 application.yml 文件中添加 Eheache 的相关配置,让 Spring Boot 自动检测和配置即可。
在项目chapter06_Ehcache的 resources 目录下创建文件 ehcache.xml,在该文件中添加 Ehcache 的相关配置,具体如文件 6-9 所示。
6-9丨ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"><diskStore path="D:/Class/ehcache"/><cachename="book"eternal="true"diskPersistent="true"maxElementsInMemory="1000"overflowToDisk="false"memoryStoreEvictionPolicy="LRU"><bootstrapCacheLoaderFactoryclass="net.sf.ehcache.store.DiskStoreBootstrapCacheLoaderFactory"properties="bootstrapAsynchronously=true"/></cache>
</ehcache>
四、设置实体类
由于本案例要将缓存序列化到本地磁盘,所以业务中操作的实体类需要实现序列化接口。使Book类实现序列化接口,修改后如文件 6-10 所示。
文件6-10丨Book.java
import jakarta.persistence.*;
import java.io.Serializable;
@Entity
@Table(name="book")
public class Book implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id; //图书编号@Column(name="name")private String name; //图书名称private String author; //图书作者private String press; //图书出版社private String status; //图书状态public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPress() {return press;}public void setPress(String press) {this.press = press;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public Book() {}public Book(Integer id, String name, String author, String press, String status) {this.id = id;this.name = name;this.author = author;this.press = press;this.status = status;}@Overridepublic String toString() {return "Book{" +"id=" + id +", name='" + name + '\'' +", author='" + author + '\'' +", press='" + press + '\'' +", status='" + status + '\'' +'}';}
}
在上述代码中,只添加了实现 Serializable 接口的代码,其他代码与原代码文件一致。
以上是实现Ehcache缓存需要修改的内容,其它的代码文件与“Spring Boot整合缓存——声明式缓存注解的应用!超详细!”中一致。
五、测试缓存效果
运行文件6-8后,在浏览器中访问http://localhost:8080/book/findById/2,查询图书信息控制台输出信息和浏览器中查询到的图书信息如图1-2和图1-3所示。


从图1-2中可以看出,控制台输出了一条查询语句,说明查询图书信息时发送对应的SQL到数据库进行查询。
从图1-3中可以看出,浏览器中展示了id为2的图书信息,说明图书查询成功。
再次在浏览器中访问 http://localhost:8080/book/findById/2,查询id为2的图书信息,控制台输出信息如图1-4 所示。

从图 1-4 可以看出,控制台没有输出新的SOL信息,说明此时查询到的图书信息是从缓存中获取到的,而没有查询数据库。
在浏览器中访问 http://localhost:8080/book/editById/2/观堂别集,将id为2的图书名称更新为“观堂别集”。此时控制台输出信息和浏览器中査询到的图书信息如图 1-5 和图1-6所示。


从图1-5可以看出,控制台输出了两条语句,即1条查询语句和1条更新语句,说明更新图书信息时,执行BookServiceImpl中的updateById()方法时,发送查询和更新图书信息的SOL语句。
从图1-6可以看出,id为2的图书名称更新为“观堂别集”。
此时,单击 IDEA 控制台的按钮,正常关闭程序,如图1-7所示。程序关闭后,打开之前设置的缓存数据保存到本地磁盘的文件路径,如图1-8所示。


从图1-8可以看出,保存缓存数据到本地磁盘的文件路径下自动生成了后缀名为.data的数据文件,以及后级名为.index的索引文件,这两个文件都是Ehcache自动序列化到本地的缓存文件。
此时,在此运行文件6-8后,在浏览器中访问http://localhost:8080/book/findById/2,套询图书信息,控制台输出信息和浏览器中查询到的图书信息如图 1-9 和图 1-10 所示。
从图1-9可以看出,控制台并没有输出任何SOL语句。


从图1-10可以看出,浏览器中展示了id为2的图书信息,说明图书查询成功,程序启动后,将之前序列化在磁盘中的缓存添加到内存的缓存中。
需要注意的是,为了确保程序关闭时成功将内存中的缓存数据序列化到本地磁盘,建议采用正常关闭程序的方式,直接杀死进程等非正常关闭方式可能导致缓存序列化到本地磁失败。
📢 互动时间
本文的代码和思路是否解决了你的问题?欢迎在评论区分享你的想法或疑问!无论是更好的实现方式,还是遇到的其他问题,都可以详细描述,我会第一时间与你交流探讨。你的点赞/收藏是我持续创作的动力,技术无边界,让我们一起进步!🚀💬