SpringBoot集成緩存功能詳解
1. 緩存規(guī)范
Java Caching定義了五個(gè)核心接口,分別是:CachingProvider、CacheManager、Cache、Entry和Expiry。
- CachingProvider:定義了創(chuàng)建、配置、獲取、管理和控制多個(gè)CacheManager。一個(gè)應(yīng)用可以在運(yùn)行期訪問多個(gè)CachingProvider。
- CacheManager:定義了創(chuàng)建、配置、獲取、管理和控制多個(gè)唯一命名的Cache,這些Cache存在于CacheManager的上下文中。一個(gè)CacheManager僅被一個(gè)CachingProvider所擁有。
- Cache:是一個(gè)類似Map的數(shù)據(jù)結(jié)構(gòu)并臨時(shí)存儲(chǔ)以key為索引的值,一個(gè)Cache僅被一個(gè)CacheManager所擁有。
- Entry:是一個(gè)儲(chǔ)存在Cache中的key-value對。
- Expiry:每一個(gè)儲(chǔ)存在Cache中的條目有一個(gè)定義的有效期。一旦超過這個(gè)時(shí)間,條目為過期的狀態(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的實(shí)現(xiàn),如RedisCache、EhcacheCache、ConcurrentMapCache等。
描述 | |
---|---|
Cache | 緩存接口,定義緩存操作,實(shí)現(xiàn)有RedisCache、EhcacheCache、ConcurrentMapCache等 |
CacheManager | 緩存管理器,管理各種緩存(Cache)組件 |
@Cacheable | 主要針對方法配置,能夠根據(jù)方法的請求參數(shù)對其結(jié)果進(jìn)行緩存 |
@CacheEvict | 清空緩存 |
@CachePut | 保證方法被調(diào)用,又希望結(jié)果被緩存 |
@EnableCaching | 開啟基于注解的緩存 |
keyGenerator | 緩存數(shù)據(jù)時(shí)key的生成策略 |
serialize | 緩存數(shù)據(jù)時(shí)value的序列化策略 |
@Cacheing | 指定多個(gè)緩存策略 |
3. 緩存裝配
Spring Boot提供的緩存自動(dòng)配置都記錄在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
使用緩存時(shí)只需要導(dǎo)入對應(yīng)的實(shí)現(xiàn)即可,Spring Boot自動(dòng)幫我們裝配。
4. 簡單緩存
使用Spring Boot提供的基于Map的內(nèi)存級(jí)緩存
4.1 依賴管理
引入Spring Boot緩存場景啟動(dòng)器,默認(rèn)導(dǎo)入的就是SimpleCacheConfiguration配置,是基于Map的內(nèi)存級(jí)緩存
<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) { // 啟動(dòng)應(yīng)用程序 SpringApplication.run(SimpleCacheServiceApplication.class, args); } }
4.3 Cacheable
@Cacheable:先查詢緩存數(shù)據(jù),如果存在直接取出緩存數(shù)據(jù)返回,如果不存在就執(zhí)行目標(biāo)方法,將方法返回值存入緩存,常用于查詢數(shù)據(jù)。
注解屬性
屬性 | 描述 |
---|---|
cacheNames | 緩存的名字 |
key | 緩存索引,默認(rèn)使用方法參數(shù)值 |
keyGenerator | 緩存索引生成器,與key屬性二選一 |
cacheManager | 緩存管理器 |
condition | 滿足條件進(jìn)行緩存 |
unless | 滿足條件不進(jìn)行緩存 |
sync | 是否使用異步,默認(rèn)為false |
@Override @Cacheable(cacheNames = "user", key = "#userId") public User findUserInformationByUserId(Integer userId) { log.info("通過用戶編號(hào)查詢用戶信息......"); return new User(userId, "Jack", LocalDateTime.now(), true); }
第一次調(diào)用:先查詢緩存,此時(shí)緩存中不存在數(shù)據(jù),執(zhí)行目標(biāo)方法后將目標(biāo)方法返回?cái)?shù)據(jù)存入緩存
第二次調(diào)用:先查詢緩存,此時(shí)緩存存在數(shù)據(jù)不執(zhí)行目標(biāo)方法
4.4 CachePut
@CachePut:每次都先執(zhí)行目標(biāo)方法,將方法返回值存入緩存,常用于添加數(shù)據(jù)和修改數(shù)據(jù)。
注解屬性
屬性 | 描述 |
---|---|
cacheNames | 緩存的名字 |
key | 緩存索引,默認(rèn)使用方法參數(shù)值 |
keyGenerator | 緩存索引生成器,與key屬性二選一 |
cacheManager | 緩存管理器 |
condition | 滿足條件進(jìn)行緩存 |
unless | 滿足條件不進(jìn)行緩存 |
@Override @CachePut(cacheNames = "user", key = "#user.userId") public Boolean insertUserInformation(User user) { log.info("業(yè)務(wù)層 - 添加用戶信息......"); return true; }
4.5 CacheEvict
@CacheEvict:在執(zhí)行目標(biāo)方法之后清除緩存,也可以指定在執(zhí)行目標(biāo)方法之前清除緩存,常用于刪除數(shù)據(jù)。
注解屬性
屬性 | 描述 |
---|---|
cacheNames | 緩存的名字 |
key | 需要清除緩存的索引,默認(rèn)使用方法參數(shù)值 |
keyGenerator | 緩存索引生成器,與key屬性二選一 |
cacheManager | 緩存管理器 |
condition | 滿足條件進(jìn)行清除緩存 |
allEntries | 是否清除全部緩存,默認(rèn)為false |
beforeInvocation | 是否在目標(biāo)方法執(zhí)行之前清除緩存,默認(rèn)為false |
@Override @CacheEvict(cacheNames = "user", key = "#userId") public Boolean deleteUserInformationByUserId(Integer userId) { log.info("業(yè)務(wù)層 - 刪除用戶信息......"); return true; }
4.6 Caching
@Caching:方法級(jí)注解,可以指定復(fù)雜的緩存策略。
4.7 CacheConfig
@CacheConfig:類級(jí)注解,配置該類緩存策略的一些公共屬性,比如緩存名稱、緩存管理器、緩存索引生成策略
到此這篇關(guān)于SpringBoot集成緩存功能詳解的文章就介紹到這了,更多相關(guān)SpringBoot集成緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud Gateway中斷言路由和過濾器的使用詳解
這篇文章主要介紹了SpringCloud Gateway中斷言路由和過濾器的使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04Java使用easyExcel批量導(dǎo)入數(shù)據(jù)詳解
這篇文章主要介紹了Java使用easyExcel批量導(dǎo)入數(shù)據(jù)詳解,通常我們會(huì)提供一個(gè)模板,此模塊我們可以使用easyExcel導(dǎo)出數(shù)據(jù)生成的一個(gè)Excel文件當(dāng)作模板,提供下載鏈接,用戶在該文件內(nèi)填入規(guī)定的數(shù)據(jù)格式以后可以批量導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫中,需要的朋友可以參考下2023-08-08Java利用Request請求如何獲取IP地址對應(yīng)的省份、城市詳解
之前已經(jīng)給大家介紹了關(guān)于Java用Request請求獲取IP地址的相關(guān)內(nèi)容,那么下面這篇文章將給大家進(jìn)入深入的介紹,關(guān)于Java利用Request請求如何獲取IP地址對應(yīng)省份、城市的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10Java操作redis實(shí)現(xiàn)增刪查改功能的方法示例
這篇文章主要介紹了Java操作redis實(shí)現(xiàn)增刪查改功能的方法,涉及java操作redis數(shù)據(jù)庫的連接、設(shè)置、增刪改查、釋放資源等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08@ConfigurationProperties遇到的坑及解決
這篇文章主要介紹了解決@ConfigurationProperties遇到的坑,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07