參考博客:https://blog.csdn.net/weixin_36279318/article/details/82820880
https://www.cnblogs.com/imyijie/p/6518547.html
https://www.cnblogs.com/zsychanpin/p/7191021.html
https://blog.csdn.net/s297485987/article/details/80781380
https://www.cnblogs.com/kingsonfu/p/10409596.html
一.Cache是什么,為什么要用緩存
一個項目隨着時間的積累, 數據規模會越來越大, 對數據的訪問需求也越來越高, 數據庫的查詢等操作的使用量也會越來越大.但是數據庫的性能是有上限的.因此如何提高數據查詢的性能, 分擔數據庫的訪問壓力也成為了一個重要的功能.
而緩存就是實際工作中經常會被使用的一種分擔數據庫訪問壓力,提高數據查詢性能的方法.
從3.1開始Spring引入了對Cache的支持。其使用方法和原理都類似於Spring對事務管理的支持。Spring Cache是作用在方法上的,其核心思想是:當我們在調用一個緩存方法時會把該方法參數和返回結果作為一個鍵值存放在緩存中,等到下次利用同樣的參數調用該方法時將不再執行該方法,而是直接從緩存中獲取結果進行返回。
Spring Cache, 本質上不是一個具體的緩存實現方案, 而是一個對緩存使用的抽象, 只要通過一定的配置和既有的代碼,注解,就可以利用各種緩存方案 如EHCache,Redis等, 來暫時存儲數據.
二.怎么使用Cache
使用Spring Cache只需要我們做兩件事
(1)聲明某些方法使用緩存
(2)配置Spring對Cache的支持
Spring為我們提供了幾種注解來支持SpringCache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable標記的方法在執行后Spring Cache將緩存其返回結果,而使用@CacheEvict標記的方法會在方法執行前或者執行后移除Spring Cache中的某些元素。
三.理解Cache緩存的內容和思路
Java Caching的五個核心接口:
- CachingProvider 定義了創建,配置,獲取,管理和控制多個CacheManager. 一個應用可以在運行時訪問多個CachingProvider
- CacheManager 定義了創建,配置,獲取,管理和控制多個唯一命名的Cache, 這些Cache存在於CacheManager的上下文中. 一個CacheManager只能被一個CachingProvider所擁有.
- Cache 是一個類似Map的數據結構並臨時存儲以key為索引的值. 一個Cache僅被一個CacheManager所擁有.
- Entry 是一個存儲在Cache中的key-value對
- Expiry 每一個存儲在Cache中的條目有一個定義的有效期.一旦超過這個有效期,條目為過期的狀態,條目將不可訪問 ,更新和刪除. 緩存有效期可以通過ExpiryPolicy設置.
以下來自:https://blog.csdn.net/weixin_36279318/article/details/82820880
Spring中定義了org.springframework.cache.Cache接口和org.springframework.cache.CacheManager接口來統一不同的緩存技術, 並支持JCache(JSR-107)注解簡化我們開發.
- Cache接口為緩存的組件規范定義, 包含緩存的各種操作集合
- Cache接口下Spring提供了各種xxxCache的實現,如RedisCache,EhCacheCache等.
- 每次調用需要緩存功能的方法時,Spring會檢查指定參數的指定目標方法是否已經被調用過,如果有被調用, 則從緩存中獲取方法調用后的結果, 如果沒有就調用方法, 並把結果緩存后返回給用戶. 下次調用時直接從緩沖中獲取結果(如果未過期的話)
- 使用Spring緩存抽象時要關注的兩點:
1.確定方法需要被緩存以及他們的緩存策略
2.從緩存中讀取之前緩存存儲的數據
下面是重要的概念和緩存注解
Cache | 緩存接口, 定義緩存操作. 具體實現:RedisCache,EhCacheCache, ConcurentMapCache等 |
CacheManager | 緩存管理器,管理各種緩存組件 |
@Cacheable | 主要針對方法配置, 能夠根據方法的請求參數對結果進行緩存 |
@CacheEvict | 清空緩存 |
@CachePut | 保證方法被調用,又希望結果被緩存 |
@EnableCaching | 開啟基於注解的緩存 |
keyGenerator | 緩存數據時key生成策略 |
serializer | 緩存數據時,key和value的序列化策略 |
@Cacheable, @CacheEvict 和 @CachePut的主要參數
value | 緩存的名稱,在 spring 配置文件中定義,必須指定 至少一個 | 例如: @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”} |
key | 緩存的 key,可以為空,如果指定要按照 SpEL 表達 式編寫,如果不指定,則缺省按照方法的所有參數 進行組合 | 例如: @Cacheable(value=”testcache”,key=”#userName” |
condition | 緩存的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行緩存/清除緩存,在 調用方法之前之后都能判斷 | 例如: @Cacheable(value=”testcache”,condition=”#userNam e.length()>2”) |
allEntries(@CacheEvict) | 是否清空所有緩存內容,缺省為 false,如果指定為 true,則方法調用后將立即清空所有緩存 | 例如:@CachEvict(value=”testcache”,allEntries=true) |
beforeInvocation(@CacheEvict) | 是否在方法執行前就清空,缺省為 false,如果指定 為 true,則在方法還沒有執行的時候就清空緩存, 缺省情況下,如果方法執行拋出異常,則不會清空 緩存 | 例如:@CachEvict(value=”testcache”, beforeInvocation=true) |
unless(@CachePut)(@Cacheable) | 用於否決緩存的,不像condition,該表達式只在方 法執行之后判斷,此時可以拿到返回值result進行判 斷。條件為true不會緩存,fasle才緩存 | 例如:@Cacheable(value=”testcache”,unless=”#result == null”) |
Cache SpEL available metadata
名字 | 位置 | 描述 | 實例 |
methodName | root object | 當前被調用的方法名 | #root.methodName |
method | root object | 當前被調用的方法 | #root.method.name |
target | root object | 當前被調用的目標對象 | #root.target |
targetClass | root object | 當前被調用的目標對象的類 | #root.targetClass |
args | root object | 當前被調用的方法的參數列表 | #root.args[0] |
caches | root object | 當前方法調用使用的緩存列表 | #root.caches[0].name |
argumentname | evaluation context | 方法參數的名字. 0代表參數的索引。 | #a0、#p0 |
result | evaluation context | 方法執行后的返回值 | #result |