SpringBoot入門 (八) Cache使用
本文記錄學習在SpringBoot中使用Cache。
一 為什麼要使用快取
快取是一個數據交換的緩衝區,在一些條件下可以替代資料庫。舉個例子:我們有一個查詢的業務,訪問資料的頻率特別高,且每次訪問時的查詢條件都一樣,資料庫的資料一直儲存不變,這樣我們每次查詢出來的結果都是一樣的。為了降低高頻率訪問資料庫給資料庫帶來的壓力,我們可以在第一次訪問後把資料快取起來,以後再做相同查詢時只去快取中取資料,而不用取資料庫再做查詢。
二 使用Cache
SpringBoot對快取做了支援以供我們方便快速的使用,我們只需要引入相關依賴就可以了。在專案啟動時會自動根據配置進行識別和初始化操作。
在pom.xml檔案中引入對Cache支援的依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
要使用Cache,我們必須在啟動時開啟Cache,@EnableCaching 說明開啟快取
@SpringBootApplication @EnableCaching public class CacheApplication { public static void main(String[] args) { SpringApplication.run(CacheApplication.class, args); } }
Spring Cache有3個比較重要的註解@Cacheable,@CachePut,@CacheEvict,我們一個一個說明:
1 @Cacheable
這個註解表明對操作進行快取,它可以放在類上,表明對當前類中所有的方法的結果進行快取;也可以放在方法上,表明對當前方法的結果進行快取。它有3個引數:
Value 快取的名稱
Key 快取的鍵,可以為空,如果指定要按照 SpEL 表示式編寫;如果不指定,則預設按照方法的所有引數進行組合
Condition 快取觸發的條件,返回值是true和false,只有滿足條件的情況(true)才會加入快取,預設為空,既表示全部都加入快取,支援 SpEL表示式。
實現程式碼
@RestController public class CacheController { @RequestMapping("/hello") @Cacheable(value="helloCache", key = "#name", condition = "#name.length()>2") public String hello(@RequestParam(value="name", required = true) String name){ System.out.println("沒有走快取,去資料庫查詢資料"); return "hello,"+name; } }
我們的方法中有一個引數,模擬資料庫查詢時的條件,如上,當我們的引數name的長度大於2時,引數加入的快取中。如果我們請求http://localhost:8080/hello?name=ch,不管我們請求多少次控制檯中都會打印出‘沒有走快取,去資料庫查詢資料’,說明快取沒有觸發,如果我們請求http://localhost:8080/hello?name=cache,第一次請求時控制檯會打印出‘沒有走快取,去資料庫查詢資料’,之後不會再有,說明在方法執行前會先去快取中看是否有結果,有則返回結果,沒則執行請求方法,如第一次請求時執行後已經對結果進行了快取,我們再請求時會直接去快取中取結果,不會再去執行方法請求資料庫了。
2 @CachePut
它與@Cacheable類似,都是說明要做快取,而且屬性Key,Value,Condition的用法都一樣,也可以使用在類或者方法上,區別是它每次都會執行實際方法(如查詢資料庫)
程式碼實現
@RequestMapping("/hello1") @CachePut(value="helloCache", key = "#name", condition = "#name.length()>2") public String hello1(@RequestParam(value="name", required = true) String name){ System.out.println("沒有走快取,去資料庫查詢資料"); return "hello,"+name; }
當我們請求http://localhost:8080/hello1?name=cache時,不管我們請求第幾次,都會在控制檯輸出‘沒有走快取,去資料庫查詢資料’。如果資料庫資料發生了變化,則會用新的資料替換之前的同value同Key快取的資料。
3 CacheEvict
它是用來清除快取的,同樣是可以標記在類和方法上,標記在類上時說明所有方法都會清除快取。Key,Value,Condition屬性用法與Cacheable一樣,還有2個屬性allEntries和beforeInvocation。
allEntries表示是否刪除快取中的所有屬性,預設是false,表示不,true表示是。當被指定為true時,會忽略掉指定的Key而刪除所有。
beforeInvocation表示刪除快取的時機,預設是false,表示在方法執行完後才刪除快取,true表示在方法執行前就先刪除快取。在方法執行過程中如果發生了異常,預設設定下(false)將不能刪除掉快取。
程式碼實現
@RequestMapping("/hello2") @CacheEvict(value="helloCache", key="#name", condition="#name.length()>2", allEntries = true, beforeInvocation = true) public String hello2(@RequestParam(value="name", required = true) String name){ System.out.println("CacheEvict 清除快取"); return "hello,"+name; }
使用同樣的引數如cache,先請求執行hello方法進行資料快取,在執行hello2進行刪除快取操作,然後再執行hello1方法會發現在控制檯上又輸出了‘沒有走快取,去資料庫查詢資料’,說明執行hello2方法時已經將快取刪除掉了。
注:SpEL(Spring Expression Language)是一個支援執行時查詢和操作物件圖的強大的表示式語言,其語法類似於統一 EL,但提供了額外特性,顯式方法呼叫和基本字串模板函式。