SpringBoot整合Caffeine實(shí)現(xiàn)本地緩存的實(shí)踐分享
前言
小伙伴們大家好,緩存是提升系統(tǒng)性能的一個不可或缺的工具,通過緩存可以避免大部分重復(fù)的請求到數(shù)據(jù)庫層,減少IO鏈接次數(shù),提升整體的響應(yīng)速率;具體的緩存工具可以分為本地緩存和分布式緩存(比如 redis),優(yōu)先使用本地緩存,因?yàn)橐话闱闆r下使用分布式緩存有點(diǎn)大材小用了;本地緩存中比較常見的比如 Caffeine 緩存,這篇文章將結(jié)合具體的 Springboot 項(xiàng)目搭配 Caffeine 實(shí)現(xiàn)本地緩存的各種使用方式
一、Caffeine
Caffeine 是一個現(xiàn)代化的 Java 緩存庫,設(shè)計(jì)用于提供高性能和可伸縮性的本地緩存解決方案。適用于高并發(fā)以及快速訪問數(shù)據(jù)的場景,因?yàn)閮?nèi)部實(shí)現(xiàn)了基于 ConcurrentHashMap 的數(shù)據(jù)結(jié)構(gòu),從而保證并發(fā)訪問時的線程安全和高性能。
在 Spring Framework 中,通常通過 Spring Cache 抽象來使用 Caffeine 緩存,常用的注解包括:
@Cacheable:
用于標(biāo)記方法可以使用緩存。當(dāng)方法被調(diào)用時,Spring 會首先檢查緩存中是否存在對應(yīng)的數(shù)據(jù),如果存在則直接返回緩存中的數(shù)據(jù),否則執(zhí)行方法并將返回值存入緩存。
@CachePut:
用于更新緩存中的數(shù)據(jù)。與 @Cacheable 不同的是,@CachePut 注解的方法始終會執(zhí)行,并將執(zhí)行結(jié)果存入指定的緩存中,適用于更新操作后需要同步更新緩存的場景。
@CacheEvict:
用于從緩存中移除一個或多個條目??梢酝ㄟ^指定的 key 或條件來移除緩存中的數(shù)據(jù),常用于執(zhí)行刪除操作后清除相應(yīng)的緩存條目,以保證數(shù)據(jù)一致性。
二、項(xiàng)目實(shí)踐
2.1 環(huán)境準(zhǔn)備
后續(xù)測試是基于一個可運(yùn)行的 SpringBoot 項(xiàng)目,通過 ApiPost 模擬請求測試緩存接口
2.2 項(xiàng)目搭建
2.2.1 依賴引入 + 配置
在項(xiàng)目的 pom.xml 文件中添加以下依賴,然后點(diǎn)擊 Maven 刷新,Maven 會從配置的遠(yuǎn)程倉庫中自動下載并導(dǎo)入依賴包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.5.5</version>
</dependency>
在 .properties 配置文件中 加入以下配置,設(shè)置了緩存的類型以及自定義的緩存參數(shù),比如過期時間
spring.cache.type=caffeine spring.cache.caffeine.spec=initialCapacity=10,maximumSize=200,expireAfterWrite=30s
另外不要忘了在啟動類上加開啟緩存的注解

2.2.2 測試接口
因?yàn)?Caffeine 常用的注解有三個,所以這里三個測試接口分別測試每種注解的使用
第一個測試接口對應(yīng)的是 @Cacheable 注解的使用,value 指明緩存的名稱為 data , key 利用 Spring EL 表達(dá)式與請求參數(shù)中的 "s" 相關(guān)聯(lián),方法作用就是打印當(dāng)前時間
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
/**
* @author HuangBen
*/
@RestController
@RequestMapping("/cache")
public class CachController {
@Cacheable(value = "data",key = "#s")
@GetMapping("/get")
public String getData(String s){
LocalDateTime now = LocalDateTime.now();
String time = now.toString();
System.out.println("查詢到數(shù)據(jù):"+ time);
return " 查詢到數(shù)據(jù) :" + time;
}
@CachePut(value = "data",key = "#s")
@GetMapping("/put")
public String putData(String s){
LocalDateTime now = LocalDateTime.now();
String time = now.toString();
System.out.println("存儲數(shù)據(jù):"+ time);
return " 存儲數(shù)據(jù) :" + time;
}
@CacheEvict(value = "data",key = "#s")
@PostMapping("/rem")
public String remData(String s){
LocalDateTime now = LocalDateTime.now();
String time = now.toString();
System.out.println("清除數(shù)據(jù) :"+time);
return " 清除數(shù)據(jù) :" + time;
}
}2.3 接口測試
2.3.1 測試 @Cacheable 注解
通過模擬請求,可以看到成功創(chuàng)建緩存,并且在三十秒內(nèi)重復(fù)請求的話,直接返回緩存中的數(shù)據(jù)并不會重新執(zhí)行方法體,從控制臺只打印了一條日志也可以體現(xiàn)


2.3.2 測試 @CachePut 注解
@CachePut 注解的特性就是每次都進(jìn)到方法體,然后執(zhí)行結(jié)束后會進(jìn)行緩存刷新,這一點(diǎn)可以從測試 @Cacheable 注解體現(xiàn),執(zhí)行完一次 cacheput 操作后,之前的接口返回的緩存也是 CachePut 接口產(chǎn)生的數(shù)據(jù)


2.3.3 測試 @CacheEvict 注解
@CacheEvict 注解的主要作用是清除指定的緩存,通常用于刪除數(shù)據(jù)的業(yè)務(wù)邏輯之后,一并清除緩存;這里可以通過控制臺信息體現(xiàn),先使用 Cacheput 操作產(chǎn)生緩存,然后調(diào)用 CacheEvict 清除緩存,再通過 Cacheable 操作查詢緩存,結(jié)果顯示并未查詢到 CachePut 中產(chǎn)生的緩存數(shù)據(jù)


三、章末
以上就是SpringBoot整合Caffeine實(shí)現(xiàn)本地緩存的實(shí)踐分享的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Caffeine本地緩存的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MyBatis?Plus?導(dǎo)入IdType失敗的解決
這篇文章主要介紹了MyBatis?Plus?導(dǎo)入IdType失敗的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
關(guān)于FastJson?long?溢出問題的小結(jié)
這篇文章主要介紹了關(guān)于FastJson?long?溢出問題的小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。2022-01-01
java利用遞歸調(diào)用實(shí)現(xiàn)樹形菜單的樣式
這篇文章主要給大家介紹了關(guān)于java利用遞歸調(diào)用實(shí)現(xiàn)樹形菜單樣式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
maven如何利用springboot的配置文件進(jìn)行多個環(huán)境的打包
這篇文章主要介紹了maven如何利用springboot的配置文件進(jìn)行多個環(huán)境的打包,在Spring Boot中多環(huán)境配置文件名需要滿足application-{profiles.active}.properties的格式,其中{profiles.active}對應(yīng)你的環(huán)境標(biāo)識,本文給大家詳細(xì)講解,需要的朋友可以參考下2023-02-02
基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境
這篇文章主要介紹了基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Java視頻斷點(diǎn)上傳的實(shí)現(xiàn)示例
斷點(diǎn)續(xù)傳指的是在下載或上傳時,將下載或上傳任務(wù)人為的劃分為幾個部分,本文主要介紹了Java視頻斷點(diǎn)上傳的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05

