当前位置: 首页 > news >正文

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 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 查询图书控制台输出信息(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的图书信息,说明图书查询成功,程序启动后,将之前序列化在磁盘中的缓存添加到内存的缓存中。

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


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

http://www.dtcms.com/a/442278.html

相关文章:

  • 数据结构 之 【LRU Cache】(注意list的splice接口函数)
  • 专门做封面的网站免费做网站怎么做网站吗
  • 25秋新三上语文1-8单元作文习作指导含填空练习+三年级上册语文各单元习作范文/写作技巧/填空练习+完整电子版可下载打印
  • 拥抱终端:Linux 新手命令行入门指南
  • wordpress 512做网站优化的协议书
  • 设计稿秒出“热力图”:AI预测式可用性测试工作流,上线前洞察用户行为
  • 种完麦子,就往南走
  • 像素时代网站建设手机站设计菏泽网站建设推广
  • python爬虫scrapy框架使用
  • mysql基础操作——库的操作和表的操作
  • 使用springboot2.6、vue2.6以及mysql从0开始搭建个人博客网页
  • MySQL 核心架构解析:从 SQL 层到存储引擎的深度探索
  • 网站建设推广济南兴田德润优惠吗网站推广四个阶段
  • logbuffer 概念及题目
  • 通用定时器的基本介绍与功能概述
  • 洛谷 P14115:[IAMOI R4] 木桶效应 ← 二分
  • Python pip -U参数作用及使用建议
  • python全栈(基础篇)——day03:基础内容(字符串格式化+简单数据类型转换+进制的转换+运算符+实战演示+每日一题)
  • 学网站建设能赚钱吗网上购物哪家质量好
  • 基于ASRPRO的语音对话
  • 女人与狗做网站天津重型网站建设风格
  • 拼图小游戏开发日记 | Day3(已完结)
  • Go 1.25 新特性:正式支持 Git 仓库子目录作为 Go 模块
  • 鸿蒙NEXT Remote Communication Kit:打破设备壁垒,构筑无缝协同体验
  • 那些网站建设的好杭州建站程序
  • 做团购网站企业网站设计调查问卷
  • 基于 RoBERTa + 多策略优化的中文商品名细粒度分类
  • 做翻译兼职的网站是哪个特色的网站建设
  • 山西建设银行招聘网站crm系统的销售管理功能包括
  • 如何在C#中配置ONNX Runtime以确保准确性和目标框位置的正确性?