Spring Boot 本地缓存工具类设计与实现
在 Spring Boot 应用中,缓存是提升性能的重要手段之一。为了更方便地使用缓存,我们可以设计一套通用的本地缓存工具类,封装常见的缓存操作,简化开发流程。本文将详细介绍如何设计并实现一套 Spring Boot 本地缓存工具类,并提供完整代码示例。
1. 工具类设计目标
在设计缓存工具类时,我们需要考虑以下目标:
- 通用性:工具类应支持多种缓存操作,如获取、添加、更新、删除等。
- 易用性:通过简单的 API 调用即可完成缓存操作,减少重复代码。
- 灵活性:支持自定义缓存过期时间、缓存键生成策略等。
- 可扩展性:工具类应易于扩展,支持不同的缓存实现(如 Caffeine、Guava 等)。
2. 工具类实现
2.1 添加依赖
首先,在 pom.xml 中添加 Spring Boot 缓存支持的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId>
</dependency>
2.2 启用缓存
在 Spring Boot 启动类上添加 @EnableCaching 注解,启用缓存功能:
@SpringBootApplication
@EnableCaching
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
2.3 缓存工具类实现
以下是一个通用的本地缓存工具类实现,基于 Spring 的 CacheManager 和 Caffeine 缓存库:
package com.example.cache;import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;import javax.annotation.Resource;
import java.util.concurrent.Callable;/*** 本地缓存工具类*/
@Component
public class LocalCacheUtil {@Resourceprivate CacheManager cacheManager;/*** 获取缓存值** @param cacheName 缓存名称* @param key 缓存键* @return 缓存值*/public <T> T get(String cacheName, Object key) {Cache cache = getCache(cacheName);if (cache != null) {Cache.ValueWrapper valueWrapper = cache.get(key);if (valueWrapper != null) {return (T) valueWrapper.get();}}return null;}/*** 获取缓存值,如果不存在则通过 loader 加载** @param cacheName 缓存名称* @param key 缓存键* @param loader 缓存加载器* @return 缓存值*/public <T> T get(String cacheName, Object key, Callable<T> loader) {Cache cache = getCache(cacheName);if (cache != null) {return cache.get(key, loader);}return null;}/*** 添加缓存** @param cacheName 缓存名称* @param key 缓存键* @param value 缓存值*/public void put(String cacheName, Object key, Object value) {Cache cache = getCache(cacheName);if (cache != null) {cache.put(key, value);}}/*** 删除缓存** @param cacheName 缓存名称* @param key 缓存键*/public void evict(String cacheName, Object key) {Cache cache = getCache(cacheName);if (cache != null) {cache.evict(key);}}/*** 清空缓存** @param cacheName 缓存名称*/public void clear(String cacheName) {Cache cache = getCache(cacheName);if (cache != null) {cache.clear();}}/*** 获取缓存对象** @param cacheName 缓存名称* @return 缓存对象*/private Cache getCache(String cacheName) {if (!StringUtils.hasText(cacheName)) {throw new IllegalArgumentException("缓存名称不能为空");}return cacheManager.getCache(cacheName);}
}
3. 工具类使用示例
3.1 配置缓存
在 application.yml 中配置 Caffeine 缓存:
spring:cache:type: caffeinecaffeine:spec: maximumSize=1000,expireAfterWrite=10m
3.2 使用工具类
在业务代码中,可以通过注入 LocalCacheUtil 来使用缓存工具类:
@Service
public class BookService {@Resourceprivate LocalCacheUtil localCacheUtil;/*** 获取书籍信息*/public Book getBookById(Long id) {// 先从缓存中获取Book book = localCacheUtil.get("books", id);if (book == null) {// 如果缓存中不存在,则从数据库加载book = loadBookFromDatabase(id);// 将结果放入缓存localCacheUtil.put("books", id, book);}return book;}/*** 更新书籍信息*/public void updateBook(Book book) {// 更新数据库updateBookInDatabase(book);// 更新缓存localCacheUtil.put("books", book.getId(), book);}/*** 删除书籍信息*/public void deleteBookById(Long id) {// 删除数据库记录deleteBookFromDatabase(id);// 删除缓存localCacheUtil.evict("books", id);}// 模拟从数据库加载书籍信息private Book loadBookFromDatabase(Long id) {// 这里模拟数据库查询return new Book(id, "Spring Boot Guide", "Author Name");}// 模拟更新数据库private void updateBookInDatabase(Book book) {// 这里模拟数据库更新}// 模拟删除数据库记录private void deleteBookFromDatabase(Long id) {// 这里模拟数据库删除}
}
4. 工具类的优势
- 简化缓存操作:通过工具类封装,业务代码中只需调用简单的方法即可完成缓存操作。
- 统一管理缓存:所有缓存操作都通过工具类进行,便于维护和扩展。
- 支持多种缓存策略:可以通过配置灵活调整缓存过期时间、最大容量等参数。
- 易于扩展:如果需要切换缓存实现(如从 Caffeine 切换到 Ehcache),只需修改配置,无需改动业务代码。
5. 总结
本文设计并实现了一套 Spring Boot 本地缓存工具类,通过封装 Spring 的 CacheManager 和 Caffeine 缓存库,提供了简单易用的缓存操作 API。该工具类可以显著简化缓存的使用,提升开发效率,同时具备良好的扩展性和灵活性。希望本文能帮助你更好地理解和使用 Spring Boot 中的本地缓存功能。
如果你有任何问题或建议,欢迎在评论区留言讨论!
相关文章:
Spring Boot 本地缓存工具类设计与实现
在 Spring Boot 应用中,缓存是提升性能的重要手段之一。为了更方便地使用缓存,我们可以设计一套通用的本地缓存工具类,封装常见的缓存操作,简化开发流程。本文将详细介绍如何设计并实现一套 Spring Boot 本地缓存工具类࿰…...
【Godot4.4】浅尝Godot中的MVC
概述 基于一个Unity的视频。学习了一下基本的MVC概念,并尝试在Godot中实现了一下。 原始的MVC: Godot中的MVC: Model、View和Controller各自应该实现的功能如下: Model: 属性(数据字段)数据存取方法数据更新信号 View: 控…...
如何解决前端的竞态问题
前端的竞态问题通常是指多个异步操作的响应顺序与发起顺序不一致,导致程序出现不可预测的结果。这种问题在分页、搜索、选项卡切换等场景中尤为常见。以下是几种常见的解决方法: 1. 取消过期请求 当用户发起新的请求时,取消之前的请求&…...
Elasticsearch为索引设置自动时间戳,ES自动时间戳
文章目录 0、思路1、配置 ingest pipeline2、在索引映射中启用_source字段的时间戳3、使用 index template 全局设置时间戳4、写入测试数据5、验证结果6、总结 在使用 Elasticsearch 进行数据存储和检索时,时间戳字段是一个非常重要的组成部分。它可以帮助我们追踪数…...
计算机网络:计算机网络的组成和功能
计算机网络的组成: 计算机网络的工作方式: 计算机网络的逻辑功能; 总结: 计算机网络的功能: 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点(计算机或设备&…...
FPGA设计时序约束用法大全保姆级说明
目录 一、序言 二、时序约束概览 2.1 约束五大类 2.2 约束功能简述 2.3 跨时钟域约束 三、时序约束规范 3.1 时序约束顺序 3.2 约束的优先级 四、约束示例 4.1 设计代码 4.2 时序结果 4.2.1 create_clock 4.2.2 create_generated_clock 4.2.3 Rename_Auto-Derive…...
云服务运维智能时代:阿里云操作系统控制台
阿里云操作系统控制台 引言需求介绍操作系统使用实例获得的帮助与提升建议 引言 阿里云操作系统控制台是一款创新型云服务器运维工具,专为简化用户的运维工作而设计。它采用智能化和可视化的方式,让运维变得更加高效、直观。借助AI技术,控制…...
硬件学习笔记--48 磁保持继电器相关基础知识介绍
目录 1.磁保持继电器工作原理 2.磁保持继电器内部结构及组成部分 3.磁保持继电器主要参数 4.总结 1.磁保持继电器工作原理 磁保持继电器利用永磁体的磁场和线圈通电产生的磁场相互作用,实现触点的切换。其特点在于线圈断电后,触点状态仍能保持&#…...
【云岚到家】-实战问题(上)
【云岚到家】-实战问题(上) 基础架构项目涉及那些角色云岚的业务流程?云岚家政包括那些模块项目采用什么架构如何开发一个接口?RESTful风格的去定义一个接口如何开发一个接口的service方法接口的异常处理怎么实现的?Sp…...
简记_硬件系统设计之需求分析要点
目录 一、 功能需求 二、 整体性能需求 三、 用户接口需求 四、 功耗需求 五、 成本需求 六、 IP和NEMA防护等级需求 七、 认证需求 功能需求 供电方式及防护 供电方式:市电供电、外置直流稳压电源供电、电池供电、PoE(Power Over Ether…...
K8s 1.27.1 实战系列(五)Namespace
Kubernetes 1.27.1 中的 Namespace(命名空间)是集群中实现多租户资源隔离的核心机制。以下从功能、操作、配置及实践角度进行详细解析: 一、核心功能与特性 1、资源隔离 Namespace 将集群资源划分为逻辑组,实现 Pod、Service、Deployment 等资源的虚拟隔离。例如,…...
ubuntu 20.04下ZEDmini安装使用
提前安装好显卡驱动和cuda,如果没有安装可以参考我的这两篇文章进行安装: ubuntu20.04配置YOLOV5(非虚拟机)_ubuntu20.04安装yolov5-CSDN博客 ubuntu20.04安装显卡驱动及问题总结_乌班图里怎么备份显卡驱动-CSDN博客 还需要提前…...
Deepseek可以通过多种方式帮助CAD加速工作
自动化操作:通过Deepseek的AI能力,可以编写脚本来自动化重复性任务。例如,使用Python脚本调用Deepseek API,在CAD中实现自动化操作。 插件开发:结合Deepseek进行二次开发,可以创建自定义的CAD插件。例如&a…...
tauri-plugin-shell插件将_blank的a标签用浏览器打开了,,,解决办法
不要使用这个插件,这个插件默认会将网页中a标签为_blank的使用默认浏览器打开,但是这种做法在我的程序里不是很友好,我需要自定义这种行为,当我点击我自己的链接的时候,使用默认浏览器打开,当点击别的链接的…...
[20250304] 关于 RISC-V芯片 的介绍
[20250304] 关于 RISC-V芯片 的介绍 1. 调研报告 一、RISC-V 芯片结构分析 RISC-V 芯片基于开源指令集架构(ISA),其核心优势在于模块化设计与高度灵活性。 指令集架构 基础指令集:包含 RV32I(32 位)、R…...
C++ 继承(2)
Hello!!大家早上中午晚上好!!今天收尾继承剩余部分内容!! 一、友元不能继承 基类的友元函数不能被子类继承,也就是基类的友元函数访问不了子类的私有或保护成员! 1.1解决方法在子…...
解决:Word 保存文档失败,重启电脑后,Word 在试图打开文件时遇到错误
杀千刀的微软,设计的 Word 是个几把,用 LaTex 写完公式,然后保存,卡的飞起 我看文档卡了很久,就关闭文档,然后 TMD 脑抽了重启电脑 重启之后,文档打不开了,显示 杀千刀的ÿ…...
【docker简化部署有状态prometheus+grafana】
文章目录 第一步 下载依赖第二步 选择一个有权限的文件夹新建配置文件prometheus.ymldocker中运行命令存储数据启动prometheus 第三步 启动grafana 第一步 下载依赖 docker pull grafana/grafana:latest docker pull prom/prometheus:latest第二步 选择一个有权限的文件夹 例…...
Java- “equals“和“==“
"equals" 用于比较是否相等 equals() 是Object类下的一个方法,而非运算符。所以只有引用数据类型才可以使用 equals()方法,基本数据类型不能使用 equals()方法; object类下的equals()源码 public boolean equals(Object obj) {return (this…...
使用 potrace.js实现图像矢量化教程
在现代Web开发中,将位图转换为矢量图形的需求日益增加。矢量图形具有可缩放性、无损质量等优点,适用于多种应用场景,如图标设计、数据可视化和响应式网页设计。potrace.js 是一个基于浏览器的JavaScript库,它实现了著名的Potrace算…...
C++后端服务器开发技术栈有哪些?有哪些资源或开源库拿来用?
一、 C后台服务器开发是一个涉及多方面技术选择的复杂领域,特别是在高性能、高并发的场景下。以下是C后台服务器开发的一种常见技术路线,涵盖了从基础到高级的技术栈。 1. 基础技术栈 C标准库 C11/C14/C17/C20:使用现代C特性,如…...
基于DeepSeek与搜索引擎构建智能搜索摘要工具
基于DeepSeek与搜索引擎构建智能搜索摘要工具 1. 项目概述 本项目通过整合DuckDuckGo搜索引擎与DeepSeek大语言模型,实现了一个智能搜索摘要生成工具。系统可自动执行以下流程: 输入查询语句进行全网搜索获取并解析搜索结果调用AI模型生成结构化摘要输出带来源标注的专业级…...
基于Asp.net的零食购物商城网站
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
springboot的实体类字段校验的分组校验
分组校验(Group Validation)允许在不同的场景下对同一个实体类应用不同的校验规则。例如,在新增数据和更新数据时,可能需要对某些字段的校验规则进行调整。以下是分组校验的具体实现步骤: 一、定义分组接口 创建空的标…...
ESP8266UDP透传
1. 配置 WiFi 模式 ATCWMODE3 // softAPstation mode 响应 : OK 2. PC 连⼊入 ESP8266 softAP 就是连接wifi 3.查询ESP8266设备的IP地址 ATCIFSR 响应: CIFSR: APIP, "192.168.4.1" CIFSR: APMAC, "1a: fe: 34: a5:8d: c6" CIFSR: STAIP, "192.…...
UE5从入门到精通之如何创建自定义插件
前言 Unreal 的Plugins插件系统中有很多的插件供大家使用,包括官方的和第三方的,这些插件不仅能帮我我们实现特定功能,还能够提升我们的工作效率。 所以我们今天就来自己创建一个自定义插件,如果我们想实现什么特定的功能,我们也可以发布到商店供大家使用了。 创建插件 …...
基于python大数据的招聘数据可视化与推荐系统
博主介绍:资深开发工程师,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有…...
olmOCR:高效精准的 PDF 文本提取工具
在日常的工作和学习中,是否经常被 PDF 文本提取问题困扰?例如: 想从学术论文 PDF 中提取关键信息,却发现传统 OCR 工具识别不准确或文本格式混乱?需要快速提取商务合同 PDF 中的条款内容,却因工具不给力而…...
Python asyncIO 面试题及参考答案 草
目录 如何正确定义一个协程函数?直接调用协程会引发什么问题? 使用 async def 定义的协程与普通函数执行流程有何本质区别? 解释 asyncio.run () 的作用及与手动管理事件循环的差异 为什么协程中必须使用 await 而非 yield 挂起操作? 写出通过 async for 实现异步迭代器…...
Spring Boot使用JDBC /JPA访问达梦数据库
Spring Boot 是一个广泛使用的 Java 框架,用于快速构建基于 Spring 的应用程序。对于达梦数据库(DMDB)的支持,Spring Boot 本身并没有直接内置对达梦数据库的集成,但你可以通过一些配置和依赖来支持达梦数据库。 以下…...
