SpringBoot 快取之 @Cacheable 詳細介紹
一、簡介
1、快取介紹
Spring 從 3.1 開始就引入了對 Cache 的支援。定義了 org.springframework.cache.Cache
和 org.springframework.cache.CacheManager
介面來統一不同的快取技術。並支援使用 JCache(JSR-107)
註解簡化我們的開發。
其使用方法和原理都類似於 Spring 對事務管理的支援。Spring Cache 是作用在方法上的,其核心思想是,當我們在呼叫一個快取方法時會把該方法引數和返回結果作為一個鍵值對存在快取中。
2、Cache 和 CacheManager 介面說明
-
Cache 介面包含快取的各種操作集合,你操作快取就是通過這個介面來操作的。
-
Cache 介面下 Spring 提供了各種 xxxCache 的實現,比如:RedisCache、EhCache、ConcurrentMapCache
-
CacheManager 定義了建立、配置、獲取、管理和控制多個唯一命名的 Cache。這些 Cache 存在於 CacheManager 的上下文中。
小結:
每次呼叫需要快取功能的方法時,Spring 會檢查指定引數的指定目標方法是否已經被呼叫過,如果有就直接從快取中獲取方法呼叫後的結果,如果沒有就呼叫方法並快取結果後返回給使用者。下次呼叫直接從快取中獲取。
二、@Cacheable 註解使用詳細介紹
1、快取使用步驟
@Cacheable
這個註解,用它就是為了使用快取的。所以我們可以先說一下快取的使用步驟:
1、開啟基於註解的快取,使用 @EnableCaching 標識在 SpringBoot 的主啟動類上。 2、標註快取註解即可
① 第一步:開啟基於註解的快取,使用 @EnableCaching
標註在 springboot 主啟動類上
② 第二步:標註快取註解
注:這裡使用 @Cacheable
註解就可以將執行結果快取,以後查詢相同的資料,直接從快取中取,不需要呼叫方法。
2、常用屬性說明
下面介紹一下 @Cacheable
這個註解常用的幾個屬性:
cacheNames/value :用來指定快取元件的名字 key :快取資料時使用的 key,可以用它來指定。預設是使用方法引數的值。(這個 key 你可以使用 spEL 表示式來編寫) keyGenerator :key 的生成器。 key 和 keyGenerator 二選一使用 cacheManager :可以用來指定快取管理器。從哪個快取管理器裡面獲取快取。 condition :可以用來指定符合條件的情況下才快取 unless :否定快取。當 unless 指定的條件為 true ,方法的返回值就不會被快取。當然你也可以獲取到結果進行判斷。(通過 #result 獲取方法結果) sync :是否使用非同步模式。
① cacheNames
用來指定快取元件的名字,將方法的返回結果放在哪個快取中,可以是陣列的方式,支援指定多個快取。
② key
快取資料時使用的 key。預設使用的是方法引數的值。可以使用 spEL 表示式去編寫。
③ keyGenerator
key 的生成器,可以自己指定 key 的生成器,通過這個生成器來生成 key。
這樣放入快取中的 key 的生成規則就按照你自定義的 keyGenerator 來生成。不過需要注意的是:
@Cacheable
的屬性,key 和 keyGenerator 使用的時候,一般二選一。
④ condition
符合條件的情況下才快取。方法返回的資料要不要快取,可以做一個動態判斷。
⑤ unless
否定快取。當 unless 指定的條件為 true ,方法的返回值就不會被快取。
⑥ sync
是否使用非同步模式。預設是方法執行完,以同步的方式將方法返回的結果存在快取中。
3、spEL 編寫 key
前面說過,快取的 key 支援使用 spEL 表示式去編寫,下面總結一下使用 spEL 去編寫 key 可以用的一些元資料: