參考博客: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的五個核心接口:
如下來自:http://www.javashuo.com/article/p-zcdnyves-ke.html
Spring中定義了org.springframework.cache.Cache接口和org.springframework.cache.CacheManager接口來統一不一樣的緩存技術, 並支持JCache(JSR-107)註解簡化咱們開發.
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 |