SpringBoot集成緩存功能詳解
1. 緩存規(guī)范
Java Caching定義了五個核心接口,分別是:CachingProvider、CacheManager、Cache、Entry和Expiry。
- CachingProvider:定義了創(chuàng)建、配置、獲取、管理和控制多個CacheManager。一個應(yīng)用可以在運行期訪問多個CachingProvider。
- CacheManager:定義了創(chuàng)建、配置、獲取、管理和控制多個唯一命名的Cache,這些Cache存在于CacheManager的上下文中。一個CacheManager僅被一個CachingProvider所擁有。
- Cache:是一個類似Map的數(shù)據(jù)結(jié)構(gòu)并臨時存儲以key為索引的值,一個Cache僅被一個CacheManager所擁有。
- Entry:是一個儲存在Cache中的key-value對。
- Expiry:每一個儲存在Cache中的條目有一個定義的有效期。一旦超過這個時間,條目為過期的狀態(tài)。一旦過期,條目將不可訪問、更新和刪除。緩存有效期可以通過ExpiryPolicy設(shè)置。

2. 緩存抽象
Spring從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口來統(tǒng)一不同的緩存技術(shù),并支持使用JCache(JSR-107)注解簡化開發(fā)。
- Cache接口為緩存的組件規(guī)范定義,包含緩存的各種操作集合。
- Cache接口下Spring提供了各種xxxCache的實現(xiàn),如RedisCache、EhcacheCache、ConcurrentMapCache等。
| 描述 | |
|---|---|
| Cache | 緩存接口,定義緩存操作,實現(xiàn)有RedisCache、EhcacheCache、ConcurrentMapCache等 |
| CacheManager | 緩存管理器,管理各種緩存(Cache)組件 |
| @Cacheable | 主要針對方法配置,能夠根據(jù)方法的請求參數(shù)對其結(jié)果進行緩存 |
| @CacheEvict | 清空緩存 |
| @CachePut | 保證方法被調(diào)用,又希望結(jié)果被緩存 |
| @EnableCaching | 開啟基于注解的緩存 |
| keyGenerator | 緩存數(shù)據(jù)時key的生成策略 |
| serialize | 緩存數(shù)據(jù)時value的序列化策略 |
| @Cacheing | 指定多個緩存策略 |
3. 緩存裝配
Spring Boot提供的緩存自動配置都記錄在CacheAutoConfiguration中,其中CacheConfigurationImportSelector最為關(guān)鍵,它幫助我們導(dǎo)入常用緩存組件,組件如下:
- org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
- org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration
- org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
- org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
- org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
- org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
- org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
- org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
- org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration
- org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration
使用緩存時只需要導(dǎo)入對應(yīng)的實現(xiàn)即可,Spring Boot自動幫我們裝配。
4. 簡單緩存
使用Spring Boot提供的基于Map的內(nèi)存級緩存
4.1 依賴管理
引入Spring Boot緩存場景啟動器,默認導(dǎo)入的就是SimpleCacheConfiguration配置,是基于Map的內(nèi)存級緩存
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>4.2 開啟緩存
通過@EnableCacheing注解開啟基于注解的緩存
@EnableCaching // 開啟基于注解的緩存
@SpringBootApplication
public class SimpleCacheServiceApplication {
public static void main(String[] args) {
// 啟動應(yīng)用程序
SpringApplication.run(SimpleCacheServiceApplication.class, args);
}
}4.3 Cacheable
@Cacheable:先查詢緩存數(shù)據(jù),如果存在直接取出緩存數(shù)據(jù)返回,如果不存在就執(zhí)行目標方法,將方法返回值存入緩存,常用于查詢數(shù)據(jù)。
注解屬性
| 屬性 | 描述 |
|---|---|
| cacheNames | 緩存的名字 |
| key | 緩存索引,默認使用方法參數(shù)值 |
| keyGenerator | 緩存索引生成器,與key屬性二選一 |
| cacheManager | 緩存管理器 |
| condition | 滿足條件進行緩存 |
| unless | 滿足條件不進行緩存 |
| sync | 是否使用異步,默認為false |
@Override
@Cacheable(cacheNames = "user", key = "#userId")
public User findUserInformationByUserId(Integer userId) {
log.info("通過用戶編號查詢用戶信息......");
return new User(userId, "Jack", LocalDateTime.now(), true);
}第一次調(diào)用:先查詢緩存,此時緩存中不存在數(shù)據(jù),執(zhí)行目標方法后將目標方法返回數(shù)據(jù)存入緩存

第二次調(diào)用:先查詢緩存,此時緩存存在數(shù)據(jù)不執(zhí)行目標方法

4.4 CachePut
@CachePut:每次都先執(zhí)行目標方法,將方法返回值存入緩存,常用于添加數(shù)據(jù)和修改數(shù)據(jù)。
注解屬性
| 屬性 | 描述 |
|---|---|
| cacheNames | 緩存的名字 |
| key | 緩存索引,默認使用方法參數(shù)值 |
| keyGenerator | 緩存索引生成器,與key屬性二選一 |
| cacheManager | 緩存管理器 |
| condition | 滿足條件進行緩存 |
| unless | 滿足條件不進行緩存 |
@Override
@CachePut(cacheNames = "user", key = "#user.userId")
public Boolean insertUserInformation(User user) {
log.info("業(yè)務(wù)層 - 添加用戶信息......");
return true;
}4.5 CacheEvict
@CacheEvict:在執(zhí)行目標方法之后清除緩存,也可以指定在執(zhí)行目標方法之前清除緩存,常用于刪除數(shù)據(jù)。
注解屬性
| 屬性 | 描述 |
|---|---|
| cacheNames | 緩存的名字 |
| key | 需要清除緩存的索引,默認使用方法參數(shù)值 |
| keyGenerator | 緩存索引生成器,與key屬性二選一 |
| cacheManager | 緩存管理器 |
| condition | 滿足條件進行清除緩存 |
| allEntries | 是否清除全部緩存,默認為false |
| beforeInvocation | 是否在目標方法執(zhí)行之前清除緩存,默認為false |
@Override
@CacheEvict(cacheNames = "user", key = "#userId")
public Boolean deleteUserInformationByUserId(Integer userId) {
log.info("業(yè)務(wù)層 - 刪除用戶信息......");
return true;
}4.6 Caching
@Caching:方法級注解,可以指定復(fù)雜的緩存策略。
4.7 CacheConfig
@CacheConfig:類級注解,配置該類緩存策略的一些公共屬性,比如緩存名稱、緩存管理器、緩存索引生成策略
到此這篇關(guān)于SpringBoot集成緩存功能詳解的文章就介紹到這了,更多相關(guān)SpringBoot集成緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java.lang.OutOfMemoryError: Metaspace異常解決的方法
這篇文章主要介紹了java.lang.OutOfMemoryError: Metaspace異常解決的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
java servlet手機app訪問接口(三)高德地圖云存儲及檢索
這篇文章主要為大家詳細介紹了java servlet手機app訪問接口(三),高德地圖云存儲及檢索,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
Sleuth+logback 設(shè)置traceid 及自定義信息方式
這篇文章主要介紹了Sleuth+logback 設(shè)置traceid 及自定義信息方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot整合SpringSecurity實現(xiàn)JWT認證的項目實踐
本文會通過創(chuàng)建SpringBoot項目整合SpringSecurity,實現(xiàn)完整的JWT認證機制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
SSH框架網(wǎng)上商城項目第16戰(zhàn)之Hibernate二級緩存處理首頁熱門顯示
這篇文章主要介紹了SSH框架網(wǎng)上商城項目第16戰(zhàn)之Hibernate的二級緩存處理首頁的熱門顯示,感興趣的小伙伴們可以參考一下2016-06-06
Swagger3.0 整合spring boot2.7x避免swagger2.0與boot2.7沖突
這篇文章主要介紹了Swagger3.0 整合spring boot2.7x避免swagger2.0與boot2.7沖突問題,通過注釋掉2.0引入的倆包,直接引入3.0,文中結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2023-10-10
springboot集成gzip和zip數(shù)據(jù)壓縮傳輸(適用大數(shù)據(jù)信息傳輸)
?在大數(shù)據(jù)量的傳輸中,壓縮數(shù)據(jù)后進行傳輸可以一定程度的解決速度問題,本文主要介紹了springboot集成gzip和zip數(shù)據(jù)壓縮傳輸,具有一定的參考價值,感興趣的可以了解一下2023-09-09

