大家在專案開發過程中,或多或少都用過快取,為了減少資料庫的壓力,把資料放在快取當中,當訪問的請求過來時,直接從快取讀取。快取一般都是基於記憶體的,讀取速度比較快,市面上比較常見的快取有:memcache、redis、mongodb、guava cache等。
快取的常規用法
大家使用快取時,常用的邏輯時這樣的:
- 根據條件生成key;
- 從快取中讀取資料,若成功讀取資料,則返回;
- 若資料不存在,根據條件從資料庫讀取;
- 將從資料庫中讀取的資料放入快取;
- 返回資料;
每一個使用快取的場景,上面的邏輯都要重寫一遍,是不是很煩躁,是不是很浪費時間。有沒有簡單的方法完成上面的邏輯?當然有了,這就是今天要向大家介紹的Spring Cache。
Spring Cache
Spring Cache並不神祕,而且使用起來非常的方便。它是註解組成的,最常用的一個註解是@Cacheable。這個註解是在方法上使用的,當使用了註解的方法被呼叫時,會先從快取中查詢,如果快取中不存在,則執行方法,然後將方法的返回值放入快取中。具體的使用方法如下:
首先,我們在IDEA中使用Spring Boot搭建環境,在選擇依賴的頁面中,我們選擇了Lombok和Cache,最主要的選擇Cache哦~ 專案搭建完畢後,我們看一下pom.xml的依賴:
我們看到在依賴中自動新增了cache。接下來我們要在SpringBoot的啟動類上加上使用cache的註解@EnableCaching,如圖:
然後我們編寫測試的controller,如下:
我們使用@RestController註解,所以它返回的是Json格式的結果。然後在方法上使用了@Cacheable註解,這是我們今天的主角。
- cacheNames:當系統中有多個快取時,指定該方法使用其中的哪幾個快取。
- key:快取的key,可以使用spEL表示式,上面的例子中,使用了入參name。
還有其他的關鍵字,在這裡沒有列出來,比如:
- sync :true或false,當併發量非常大時,將同步開啟,可以保證只有一個執行緒執行方法,其他執行緒將等待,然後從快取中讀取資料。
- condition:使用快取的條件。
- keyGenerator:指定key的生成器。
我們啟動專案,並在瀏覽器第一次訪問http://localhost:8080/cache/test?name=allen,結果響應很慢,過了5秒後,頁面顯示結果:
我們在看一下後臺日誌:
列印語句列印出來了,說明第一次訪問時,是執行了方法的。我們再在瀏覽器請求相同的地址,結果返回了相同的結果,而且後臺沒有列印出日誌,和上面兩張圖一模一樣。說明這次請求走了快取,方法並沒有執行。
總結
怎麼樣?@Cacheable很好用吧,大家趕快動手,在專案中實踐一下吧,有問題評論區留言哦