1. 程式人生 > >第四篇:SpringBoot中Cache快取的使用

第四篇:SpringBoot中Cache快取的使用

一、Cache快取的作用

隨著時間的積累,應用的使用使用者不斷增加,資料規模也越來越大,往往資料庫查詢操作會成為影響使用者使用體驗的瓶頸,此時使用快取往往是解決這一問題非常好的手段之一。Spring 3開始提供了強大的基於註解的快取支援,可以通過註解配置方式低侵入的給原有Spring應用增加快取功能,提高資料訪問效能。在Spring Boot中對於快取的支援,提供了一系列的自動化配置,使我們可以非常方便的使用快取。

1.JSR107

Java Caching定義了5個核心介面,分別是CachingProvider, CacheManager, Cache, Entry 和 Expiry。

示意圖

  • CachingProvider定義了建立、配置、獲取、管理和控制多個CacheManager。一個應用可 以在執行期訪問多個CachingProvider。
  • CacheManager定義了建立、配置、獲取、管理和控制多個唯一命名的Cache,這些Cache 存在於CacheManager的上下文中。一個CacheManager僅被一個CachingProvider所擁有。
  •  Cache是一個類似Map的資料結構並臨時儲存以Key為索引的值。一個Cache僅被一個 CacheManager所擁有。
  •  Entry是一個儲存在Cache中的key-value對。
  •  Expiry 每一個儲存在Cache中的條目有一個定義的有效期。一旦超過這個時間,條目為過期 的狀態。一旦過期,條目將不可訪問、更新和刪除。快取有效期可以通過ExpiryPolicy設定。

示意圖

2.Spring快取抽象

Spring從3.1開始定義了org.springframework.cache.Cache 和org.springframework.cache.CacheManager介面來統一不同的快取技術; 並支援使用JCache(JSR-107)註解簡化我們開發。

  • Cache介面為快取的元件規範定義,包含快取的各種操作集合。
  • Cache介面下Spring提供了各種xxxCache的實現;如RedisCache,EhCacheCache , ConcurrentMapCache。
  • 每次呼叫需要快取功能的方法時,Spring會檢查檢查指定引數的指定的目標方法是否 已經被呼叫過;如果有就直接從快取中獲取方法呼叫後的結果,如果沒有就呼叫方法 並快取結果後返回給使用者。下次呼叫直接從快取中獲取。
  •  使用Spring快取抽象時我們需要關注以下兩點:

            1.、確定方法需要被快取以及他們的快取策略

            2、從快取中讀取之前快取儲存的資料

二、幾個重要概念&快取註解

Cache 快取介面,定義快取操作。實現有:RedisCache、EhCacheCache、 ConcurrentMapCache等
CacheManager

 快取管理器,管理各種快取(Cache)元件

@Cacheable

主要針對方法配置,能夠根據方法的請求引數對其結果進行快取

@CacheEvict 清空快取
@CachePut

 保證方法被呼叫,又希望結果被快取。

@EnableCaching

開啟基於註解的快取

keyGenerator

快取資料時key生成策略

serialize 快取資料時value序列化策略
@Cacheable/@CachePut/@CacheEvict 主要的引數
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”)