Spring 緩存——@Cacheable

原創性聲明:本文完全為筆者原創,請尊重筆者勞動力。轉載務必注明原文地址。

@Cacheable 是一個既可以應用于方法級別,也可用于類級別的注解。自spring3.1開始就通過它實現了緩存管理。

  1. @Cacheable能干什么?
    為了通俗易懂的理解,舉個栗子:一個方法,getBooksByUsernameAndLanguage(String username, int language),顯然,是一個獲取數據庫里所有我的英文書對象的方法,返回應該是一個列表。如果這個函數的返回值很大,而且會在頁面上被經常調用,那么每一次調用都要重新連接數據庫并返回一個數據量龐大的list,可能頁面響應和資源占用會比較大。而我們希望的是,第一次調用這個方法時,返回的數據能被放到服務器端的緩存里,以便于后面要調用這個方法時,能直接從緩存里取到,這樣就不用再查數據庫占用資源了。而@Cacheable的作用就是這個。

  2. @Cacheable怎么用?
    舉個栗子(我就喜歡直接上代碼,簡單粗暴):

@Cacheable(value = "CACHE_BOOK",key = "#username", condition = "#language = 1")
public List<Book> getBooksByUsernameAndLanguage(String username, int language) {
     // balabalabala...里面的代碼不重要
     return bookList;
}

看code,@Cacheable注解只有三個屬性。

  • value : 必須要的。就是個自己取的名字,通過它指明了第一次調用這個方法時返回的bookList將被存在內存的哪里。
  • key : 可選。要使用SpEL表達式,這里與參數username對應,當傳入的username值變了的話就不去取緩存里的數據了,而是執行getBooksByUsernameAndLanguage方法。(這是必須的,因為username變了,返回值也就變了,緩存里的數據不符合了,因此這個選項很重要)。spring默認用方法的簽名來當做key。
  • condition:方法返回的結果bookList,要不要緩存起來?condition就添加了一個限定條件。這個例子中,只有傳入的語言代碼是1,返回的bookList才會被緩存起來,如果給language傳了別的值,那么bookList是不會緩存起來的。

下次再遇到頁面刷新后數據還不更新的問題時,記得看看是不是@Cacheable搞的鬼。

補充: 事實上,第二次調用方法時,spring會在執行getBooksByUsernameAndLanguage方法前先去緩存里看是否有相應的數據,有,則不會執行方法。沒有,才執行。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,969評論 19 139
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的...
    笨鳥慢飛閱讀 5,656評論 0 4
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,959評論 6 342
  • 今天看到這樣一句話:老天不給你困難,你又如何看透人心。 我把它改了:老天不給你困難,你又如何體會生命無常? 人一輩...
    彩云_57b1閱讀 557評論 0 2