SpringCache簡單梳理

參考博客:http://www.javashuo.com/article/p-zcdnyves-ke.htmlhtml

http://www.javashuo.com/article/p-rhcvdrzf-bt.htmlspring

http://www.javashuo.com/article/p-bbyqnpwv-cr.html數據庫

https://blog.csdn.net/s297485987/article/details/80781380緩存

 http://www.javashuo.com/article/p-arqzrsny-db.html數據結構

 一.Cache是什麼,爲何要用緩存less

    一個項目隨着時間的積累, 數據規模會愈來愈大, 對數據的訪問需求也愈來愈高, 數據庫的查詢等操做的使用量也會愈來愈大.可是數據庫的性能是有上限的.所以如何提升數據查詢的性能, 分擔數據庫的訪問壓力也成爲了一個重要的功能.ide

    而緩存就是實際工做中常常會被使用的一種分擔數據庫訪問壓力,提升數據查詢性能的方法.性能

    從3.1開始Spring引入了對Cache的支持。其使用方法和原理都相似於Spring對事務管理的支持。Spring Cache是做用在方法上的,其核心思想是:當咱們在調用一個緩存方法時會把該方法參數和返回結果做爲一個鍵值存放在緩存中,等到下次利用一樣的參數調用該方法時將再也不執行該方法,而是直接從緩存中獲取結果進行返回。lua

    Spring Cache, 本質上不是一個具體的緩存實現方案, 而是一個對緩存使用的抽象, 只要經過必定的配置和既有的代碼,註解,就能夠利用各類緩存方案 如EHCache,Redis等, 來暫時存儲數據.spa

 

二.怎麼使用Cache

     使用Spring Cache只須要咱們作兩件事

      (1)聲明某些方法使用緩存

      (2)配置Spring對Cache的支持

      Spring爲咱們提供了幾種註解來支持SpringCache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable標記的方法在執行後Spring Cache將緩存其返回結果,而使用@CacheEvict標記的方法會在方法執行前或者執行後移除Spring Cache中的某些元素。

 

三.理解Cache緩存的內容和思路

Java Caching的五個核心接口:

  1. CachingProvider 定義了建立,配置,獲取,管理和控制多個CacheManager. 一個應用能夠在運行時訪問多個CachingProvider
  2. CacheManager  定義了建立,配置,獲取,管理和控制多個惟一命名的Cache, 這些Cache存在於CacheManager的上下文中. 一個CacheManager只能被一個CachingProvider所擁有.
  3. Cache  是一個相似Map的數據結構並臨時存儲以key爲索引的值. 一個Cache僅被一個CacheManager所擁有.
  4. Entry   是一個存儲在Cache中的key-value對
  5. Expiry 每個存儲在Cache中的條目有一個定義的有效期.一旦超過這個有效期,條目爲過時的狀態,條目將不可訪問 ,更新和刪除. 緩存有效期能夠經過ExpiryPolicy設置.

 

如下來自:http://www.javashuo.com/article/p-zcdnyves-ke.html

 

       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
相關文章
相關標籤/搜索