緩存,在開發中是很是經常使用的。在高併發系統中,若是沒有緩存,純靠數據庫來扛,那麼數據庫壓力會很是大,搞很差還會出現宕機的狀況。本篇文章,將會帶你們學習Spring Cache緩存框架。html
本文發佈於掘金號【Happyjava】。Happy的掘金地址:juejin.im/user/5cc289…,Happy的我的博客:blog.happyjava.cn。歡迎轉載,但須保留此段聲明。java
經過Spring initialise快速建立SpringBoot工程,能夠參考:blog.happyjava.cn/articles/7.…nginx
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
複製代碼
@Configuration
@EnableCaching
public class CacheConfig {
/** * 默認就是這種配置,能夠不寫 */
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager();
}
}
複製代碼
在SpringBoot中,默認就是ConcurrentMapCacheManager的緩存方式,不寫也是能夠的。這裏能夠經過CacheManager配置不一樣的緩存實現方式,好比redis,EHCACHE等。這個在下個章節再講解。git
ConcurrentMapCacheManager還有一個不定參數的重載構造方法,github
它接收的是cacheName入參,若是設置了緩存名字,那麼後續的方法就只能使用在這裏設置的緩存,不然會拋出異常。若是是無參構造方法,那麼它是一個可變的緩存管理器。redis
Cacheable註解是用來設置緩存的。經常使用註解以下:spring
指定使用的緩存,其實也就是上面說到的cacheName。若是是無參的ConcurrentMapCacheManager,那麼這裏能夠根據本身的用途等因素自定義便可。數據庫
緩存的key,就跟Map同樣,是操做緩存的鍵。緩存
這裏接受的是 SpEL表達式。關於SpEL表達式,下面作個簡要說明:springboot
有以下方法:
@CachePut(value = "listUsers", key = "#username")
public List<String> updateCache(String username) {
System.out.println("執行了updateCache方法");
return Arrays.asList("Happyjava", "Hello-SpringBoot", System.currentTimeMillis() + "");
}
複製代碼
能夠經過 #paramName 的方式得到入參
還有一個是root對象,用法以下:
@CachePut(value = "listUsers", key = "#root.methodName+#username")
public List<String> updateCache(String username) {
System.out.println("執行了updateCache方法");
return Arrays.asList("Happyjava", "Hello-SpringBoot", System.currentTimeMillis() + "");
}
複製代碼
其實不必記住,經過IDEA的智能提示靈活使用便可:
各個參數表明的意思,相信你們一目瞭然。
緩存控制條件,若是使用了該字段,那麼只有結果爲true時,纔會緩存結果。
@Cacheable(value = "listUsers", condition = "#username.length()>5")
public List<String> listUsers(String username) {
System.out.println("執行了listUsers方法");
return Arrays.asList("Happyjava", "Hello-SpringBoot", System.currentTimeMillis() + "");
}
複製代碼
下面貼出一個設置緩存的例子:
@Cacheable(value = "listUsers", key = "#root.methodName+#username", condition = "#username.equals('Happyjava')")
public List<String> listUsers(String username) {
System.out.println("執行了listUsers方法");
return Arrays.asList("Happyjava", "Hello-SpringBoot", System.currentTimeMillis() + "");
}
複製代碼
只有當入參username等於"Happyjava"的時候,纔會緩存結果,能夠經過是否屢次打印:"執行了listUsers方法"來判斷。
相信HTTP協議熟悉的朋友一看名字就知道這個註解是幹嗎用的了。咱們能夠經過CachePut註解來更新緩存。其經常使用註解與Cacheable是一致的。下面給出一個更新緩存的例子:
@CachePut(value = "listUsers", key = "#username", condition = "#username.equals('Happyjava')")
public List<String> updateCache(String username) {
System.out.println("執行了updateCache方法");
return Arrays.asList("Happyjava", "Hello-SpringBoot", System.currentTimeMillis() + "");
}
複製代碼
咱們能夠寫一個value和key與之對應的Cacheable註解進行測試:
@Cacheable(value = "listUsers", key = "#username", condition = "#username.equals('Happyjava')")
public List<String> listUsers(String username) {
System.out.println("執行了listUsers方法");
return Arrays.asList("Happyjava", "Hello-SpringBoot", System.currentTimeMillis() + "");
}
複製代碼
測試預期的結果是:調用了CachePut方法後,Cacheable方法會返回一個新的結果。
這是一個刪除註解。經常使用參數除了上面兩個註解列出的三個以外,還有一個allEntries,這是一個布爾類型的參數,默認爲false,其意思是「是否刪除全部緩存」。在false的狀況下,只是刪除與key相對應的緩存,若是爲true,則會刪除全部緩存(固然是對應的value下的)。
@CacheEvict(value = "listUsers", key = "#username")
public void deleteCache(String username) {
System.out.println("執行了deleteCache方法");
}
@CacheEvict(value = "listUsers", allEntries = true)
public void deleteAllCache() {
}
複製代碼
固然,這只是Spring cache的一個快速上手示例,其實咱們更多時候不是這麼使用的。在實際項目中,更可能是配合redis進行使用的,這個放在下篇文章講解吧(其實也就是一些配置的事情)
搜索公衆號【Happyjava】,回覆【電子書】和【視頻】,便可獲取大量優質電子書和大數據、kafka、nginx、MySQL等視頻資料