SpringBoot入門 (八) Cache使用

本文記錄學習在SpringBoot中使用Cache。java

一 爲何要使用緩存

  緩存是一個數據交換的緩衝區,在一些條件下能夠替代數據庫。舉個例子:咱們有一個查詢的業務,訪問數據的頻率特別高,且每次訪問時的查詢條件都同樣,數據庫的數據一直保存不變,這樣咱們每次查詢出來的結果都是同樣的。爲了下降高頻率訪問數據庫給數據庫帶來的壓力,咱們能夠在第一次訪問後把數據緩存起來,之後再作相同查詢時只去緩存中取數據,而不用取數據庫再作查詢。spring

二 使用Cache

  SpringBoot對緩存作了支持以供咱們方便快速的使用,咱們只須要引入相關依賴就能夠了。在項目啓動時會自動根據配置進行識別和初始化操做。數據庫

  在pom.xml文件中引入對Cache支持的依賴緩存

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

  要使用Cache,咱們必須在啓動時開啓Cache,@EnableCaching 說明開啓緩存app

@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個參數:spring-boot

  Value 緩存的名稱學習

  Key 緩存的鍵,能夠爲空,若是指定要按照 SpEL 表達式編寫;若是不指定,則缺省按照方法的全部參數進行組合ui

  Condition 緩存觸發的條件,返回值是true和false,只有知足條件的狀況(true)纔會加入緩存,默認爲空,既表示所有都加入緩存,支持 SpEL表達式。spa

  實現代碼

@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,但提供了額外特性,顯式方法調用和基本字符串模板函數。

相關文章
相關標籤/搜索