Spring Boot整合缓存——Ehcache缓存!超详细!

前言

**!声明:**本文基于" Spring Boot整合缓存------声明式缓存注解的应用!超详细!"进行拓展。

1、Ehcache概述

Ehcache 是一种开源的缓存框架,它配置简单、结构清晰、功能强大,是当前使用最的基于 Java 语言的缓存之一。Eheache 可以很便捷地与其他流行的库和框架进行集成t中,Hibernate默认的缓存提供者就是Ehcache。

Ehcache 能够成为目前使用最广泛的缓存框架之一,主要得益于它的以下几个特点:快速轻量、伸缩性、灵活性、标准支持、可扩展性、监听器、Java企业级应用缓存、开源协议 Apache License 2.0。

2、项目目录

图1-1

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 复制代码
<?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 复制代码
<?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"/>
    <cache
            name="book"
            eternal="true"
            diskPersistent="true"
            maxElementsInMemory="1000"
            overflowToDisk="false"
            memoryStoreEvictionPolicy="LRU">
        <bootstrapCacheLoaderFactory
                class="net.sf.ehcache.store.DiskStoreBootstrapCacheLoaderFactory"
                properties="bootstrapAsynchronously=true"/>
    </cache>
</ehcache>

四、设置实体类

由于本案例要将缓存序列化到本地磁盘,所以业务中操作的实体类需要实现序列化接口。使Book类实现序列化接口,修改后如文件 6-10 所示。

文件6-10丨Book.java

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;
    }

    @Override
    public 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 查询图书控制台输出信息(1) 图1-3 浏览器中查询到的图书信息(1)

从图1-2中可以看出,控制台输出了一条查询语句,说明查询图书信息时发送对应的SQL到数据库进行查询。

从图1-3中可以看出,浏览器中展示了id为2的图书信息,说明图书查询成功。

再次在浏览器中访问 http://localhost:8080/book/findById/2,查询id为2的图书信息,控制台输出信息如图1-4 所示。
图1-4 查询图书控制台输出信息(2)

从图 1-4 可以看出,控制台没有输出新的SOL信息,说明此时查询到的图书信息是从缓存中获取到的,而没有查询数据库。

在浏览器中访问 http://localhost:8080/book/editById/2/观堂别集,将id为2的图书名称更新为"观堂别集"。此时控制台输出信息和浏览器中査询到的图书信息如图 1-5 和图1-6所示。
图1-5 更新图书控制台输出信息(3) 图1-6 浏览器中查询到的图书信息(2)

从图1-5可以看出,控制台输出了两条语句,即1条查询语句和1条更新语句,说明更新图书信息时,执行BookServiceImpl中的updateById()方法时,发送查询和更新图书信息的SOL语句。

从图1-6可以看出,id为2的图书名称更新为"观堂别集"。

此时,单击 IDEA 控制台的按钮,正常关闭程序,如图1-7所示。程序关闭后,打开之前设置的缓存数据保存到本地磁盘的文件路径,如图1-8所示。
图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-9 查询图书控制台输出信息(4) 图1-10 浏览器中查询到的图书信息(3)

从图1-10可以看出,浏览器中展示了id为2的图书信息,说明图书查询成功,程序启动后,将之前序列化在磁盘中的缓存添加到内存的缓存中。

需要注意的是,为了确保程序关闭时成功将内存中的缓存数据序列化到本地磁盘,建议采用正常关闭程序的方式,直接杀死进程等非正常关闭方式可能导致缓存序列化到本地磁失败。


📢 互动时间

本文的代码和思路是否解决了你的问题?欢迎在评论区分享你的想法或疑问 !无论是更好的实现方式,还是遇到的其他问题,都可以详细描述,我会第一时间与你交流探讨。你的点赞/收藏是我持续创作的动力,技术无边界,让我们一起进步!🚀💬

相关推荐
唐叔在学习2 小时前
文档转换神器pypandoc详解:解锁Python跨格式文档转换的终极姿势
后端·python
MClink2 小时前
架构学习之旅-架构的由来
java·学习·架构
-雷阵雨-2 小时前
数据结构——排序算法全解析(入门到精通)
java·开发语言·数据结构·排序算法·intellij-idea
aloha_7892 小时前
顺丰科技java面经准备
java·开发语言·spring boot·科技·spring·spring cloud
_extraordinary_3 小时前
Java Servlet(三)--- 写一个简单的网站,表白墙程序,登录功能的实现
java·开发语言·servlet
拂晓银砾3 小时前
数据库字段多类型Json值处理
java·后端
李贺梖梖4 小时前
Tomcat的CATALINA_BASE
java·tomcat
0wioiw04 小时前
Java基础(①Tomcat + Servlet + JSP)
java·servlet·tomcat