Spring Boot 本地緩存工具類設計與實現

在 Spring Boot 應用中,緩存是提升性能的重要手段之一。為了更方便地使用緩存,我們可以設計一套通用的本地緩存工具類,封裝常見的緩存操作,簡化開發流程。本文將詳細介紹如何設計并實現一套 Spring Boot 本地緩存工具類,并提供完整代碼示例。


1. 工具類設計目標

在設計緩存工具類時,我們需要考慮以下目標:

  1. 通用性:工具類應支持多種緩存操作,如獲取、添加、更新、刪除等。
  2. 易用性:通過簡單的 API 調用即可完成緩存操作,減少重復代碼。
  3. 靈活性:支持自定義緩存過期時間、緩存鍵生成策略等。
  4. 可擴展性:工具類應易于擴展,支持不同的緩存實現(如 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. 工具類的優勢

  1. 簡化緩存操作:通過工具類封裝,業務代碼中只需調用簡單的方法即可完成緩存操作。
  2. 統一管理緩存:所有緩存操作都通過工具類進行,便于維護和擴展。
  3. 支持多種緩存策略:可以通過配置靈活調整緩存過期時間、最大容量等參數。
  4. 易于擴展:如果需要切換緩存實現(如從 Caffeine 切換到 Ehcache),只需修改配置,無需改動業務代碼。

5. 總結

本文設計并實現了一套 Spring Boot 本地緩存工具類,通過封裝 Spring 的 CacheManager 和 Caffeine 緩存庫,提供了簡單易用的緩存操作 API。該工具類可以顯著簡化緩存的使用,提升開發效率,同時具備良好的擴展性和靈活性。希望本文能幫助你更好地理解和使用 Spring Boot 中的本地緩存功能。

如果你有任何問題或建議,歡迎在評論區留言討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897408.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897408.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

引領變革!北京愛悅詩科技有限公司榮獲“GAS消費電子科創獎-產品創新獎”!

在2025年“GAS消費電子科創獎”評選中&#xff0c;北京愛悅詩科技有限公司提交的“aigo愛國者GS06”&#xff0c;在技術創新性、設計創新性、工藝創新性、智能化創新性及原創性五大維度均獲得評委的高度認可&#xff0c;榮獲“產品創新獎”。 這一獎項不僅是對愛悅詩在消費電子…

考研英語語法全攻略:從基礎到長難句剖析?

引言 在考研英語的備考之旅中,語法猶如一座燈塔,為我們在浩瀚的英語知識海洋中指引方向。無論是閱讀理解中復雜長難句的解讀,還是寫作時準確流暢表達的需求,扎實的語法基礎都起著至關重要的作用。本文將結合有道考研語法基礎入門課的相關內容,為大家全面梳理考研英語語法…

構建自己的AI客服【根據用戶輸入生成EL表達式】

要實現一個基于對話形式的AI客服系統&#xff0c;該系統能夠提示用戶輸入必要的信息&#xff0c;并根據用戶的輸入生成相應的EL&#xff08;Expression Language&#xff09;表達式編排規則&#xff0c;您可以按照以下步驟進行設計和開發。本文將涵蓋系統架構設計、關鍵技術選型…

【JavaWeb12】數據交換與異步請求:JSON與Ajax的絕妙搭配是否塑造了Web的交互革命?

文章目錄 &#x1f30d;一. 數據交換--JSON??1. JSON介紹??2. JSON 快速入門??3. JSON 對象和字符串對象轉換??4. JSON 在 java 中使用??5. 代碼演示 &#x1f30d;二. 異步請求--Ajax??1. 基本介紹??2. JavaScript 原生 Ajax 請求??3. JQuery 的 Ajax 請求 &a…

解決CentOS 8.5被惡意掃描的問題

CentOS 8 官方倉庫已停止維護(EOL),導致一些常用依賴包如fail2ban 無法正常安裝。 完整解決方案: 一、問題根源 CentOS 8 官方倉庫已停更:2021 年底 CentOS 8 停止維護,默認倉庫的包可能無法滿足依賴關系。EPEL 倉庫兼容性:EPEL 倉庫可能未適配 CentOS 8.5 的舊版本依賴…

使用格式工廠提取視頻中的音頻

選擇輸出格式&#xff1a;在格式工廠的左側功能欄中&#xff0c;點擊 “音頻” 選項&#xff0c;會展開多種音頻格式&#xff0c;根據自己的需求選擇如 “MP3”“WAV”“WMA” 等作為輸出格式。添加視頻文件&#xff1a;點擊 “添加文件” 按鈕&#xff0c;在彈出的文件瀏覽器中…

前端雜的學習筆記

什么是nginx Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器 Nginx是一款輕量級的Web 服務器/反向代理服務器&#xff0c;處理高并發能力是十分強大的&#xff0c;并且支持熱部署&#xff0c;啟動簡單&#xff0c;可以做到7*24不間斷運行 正代和反代 學習nginx&a…

玩轉ChatGPT:GPT 深入研究功能

一、寫在前面 民間總結&#xff1a; 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么&#xff0c;ChatGPT呢&#xff1f; 看Deep Research&#xff08;深入研究&#xff09;功能。 對于科研狗來說&#xff0c;在這個文章爆炸的時代&#xff0c;如何利用AI準確、高效地收…

RabbitMQ 2025/3/5

高性能異步通信組件。 同步調用 以支付為例&#xff1a; 可見容易發生雪崩。 異步調用 以支付為例&#xff1a; 支付服務當甩手掌柜了&#xff0c;不管后面的幾個服務的結果。只管庫庫發&#xff0c;后面那幾個服務想取的時候就取&#xff0c;因為消息代理里可以一直裝&#x…

Win10 訪問 Ubuntu 18 硬盤

目錄 方案一&#xff1a;使用Samba共享服務Ubuntu 18 端配置Windows 10 端訪問 方案二&#xff1a;使用 SSHFS&#xff08;需在 Windows 上安裝 SSH 客戶端&#xff09;Ubuntu 18 端配置Windows 10 端配置 方案三&#xff1a;使用 FTP 服務Ubuntu 18 端配置Windows 10 端訪問 方…

Android15使用FFmpeg解碼并播放MP4視頻完整示例

效果: 1.編譯FFmpeg庫: 下載FFmpeg-kit的源碼并編譯生成安裝平臺庫 2.復制生成的FFmpeg庫so文件與包含目錄到自己的Android下 如果沒有prebuiltLibs目錄,創建一個,然后復制 包含目錄只復制arm64-v8a下

Hadoop、Hive、Spark的關系

Part1&#xff1a;Hadoop、Hive、Spark關系概覽 1、MapReduce on Hadoop 和spark都是數據計算框架&#xff0c;一般認為spark的速度比MR快2-3倍。 2、mapreduce是數據計算的過程&#xff0c;map將一個任務分成多個小任務&#xff0c;reduce的部分將結果匯總之后返回。 3、HIv…

計算機網絡篇:基礎知識總結與基于長期主義的內容更新

基礎知識總結 和 MySQL 類似&#xff0c;我同樣花了一周左右的時間根據 csview 對計算機網絡部分的八股文進行了整理&#xff0c;主要的內容包括&#xff1a;概述、TCP 與 UDP、IP、HTTP&#xff0c;其中我個人認為最重要的是 TCP 這部分的內容。 在此做一篇目錄索引&#xf…

[密碼學實戰]Java實現國密TLSv1.3單向認證

一、代碼運行結果 1.1 運行環境 1.2 運行結果 1.3 項目架構 二、TLS 協議基礎與國密背景 2.1 TLS 協議的核心作用 TLS(Transport Layer Security) 是保障網絡通信安全的加密協議,位于 TCP/IP 協議棧的應用層和傳輸層之間,提供: ? 數據機密性:通過對稱加密算法(如 AE…

09 HarmonyOS NEXT 仿uv-ui Tag組件開發教程系列(三)

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; 文章目錄 Tag組件實戰應用與最佳實踐1. 復雜場景應用1.1 標簽篩選系統 2. 性能優化實踐2.1 狀態管理優化2.2 渲染性能優化 3. 實用功能擴展3.1 拖拽…

clickhouse查詢效率低

《關于ClickHouse查詢效率低的探討》 在數據處理的世界里&#xff0c;數據庫扮演著至關重要的角色。ClickHouse是一款專為在線分析處理&#xff08;OLAP&#xff09;設計的列式存儲數據庫管理系統。它因其快速的數據寫入和查詢速度而聞名&#xff0c;尤其適合處理海量數據。如…

Linux系統基于ARM平臺的LVGL移植

軟硬件介紹&#xff1a;Ubuntu 20.04 ARM 和&#xff08;Cortex-A53架構&#xff09;開發板 基本原理 LVGL圖形庫是支持使用Linux系統的Framebuffer幀緩沖設備實現的&#xff0c;如果想要實現在ARM開發板上運行LVGL圖形庫&#xff0c;那么就需要把LVGL圖形庫提供的關于幀緩沖設…

【GPT入門】第14課 openai調用高德地圖案例實現多輪會話與多輪接口調用

【GPT入門】第14課 openai調用高德地圖案例實現多輪會話與多輪接口調用 1.使用openai調用高德地圖API概述2. 高德接口調用申請3.實現代碼(多個function調用,多輪對話)4.執行結果1.使用openai調用高德地圖API概述 任務描述:使用openai調用高德地圖API,實現用戶問地理有關的…

每日一題-----面試

一、什么是孤兒進程&#xff1f;什么是僵尸進程&#xff1f; 1.孤兒進程是指父進程在子進程結束之前就已經退出&#xff0c;導致子進程失去了父進程的管理和控制&#xff0c;成為了 “孤兒”。此時&#xff0c;這些子進程會被系統的 init 進程&#xff08;在 Linux 系統中&…

Python深度學習算法介紹

一、引言 深度學習是機器學習的一個重要分支&#xff0c;它通過構建多層神經網絡結構&#xff0c;自動從數據中學習特征表示&#xff0c;從而實現對復雜模式的識別和預測。Python作為一門強大的編程語言&#xff0c;憑借其簡潔易讀的語法和豐富的庫支持&#xff0c;成為深度學…