SpringCache緩存

一、概述

SpringCache本身是一個緩存體系的抽象實現,並沒有具體的緩存能力,要使用SpringCache還需要配合具體的緩存實現來完成。
雖然如此,但是SpringCache是所有Spring支持的緩存結構的基礎,而且所有的緩存的使用最後都要歸結於SpringCache。

二、緩存註解

SpringCache緩存功能的實現是依靠下面的這幾個註解完成的。

  • @EnableCaching:開啓緩存功能
  • @Cacheable:定義緩存,用於觸發緩存
  • @CachePut:定義更新緩存,觸發緩存更新
  • @CacheEvict:定義清除緩存,觸發緩存清除
  • @Caching:組合定義多種緩存功能
  • @CacheConfig:定義公共設置,位於class之上

1、@CacheConfig

該註解標註於之上,用於配置該類中會用到的一些公共的緩存相關配置。
@CacheConfig(cacheNames = “pers.liuchengyin.service.blogServiceImpl”)
cachNames的值pers.liuchengyin.service.blogServiceImpl就是這個類公共的緩存對象,就相當於一個名爲pers.liuchengyin.service.blogServiceImplMap對象,下文簡稱對象

2、@Cacheable

用在查詢的方法上,方法的返回值將被加入緩存。該註解標註的方法每次被調用前都會觸發緩存校驗,校驗指定參數的緩存是否已存在(已發生過相同參數的調用),若存在,直接返回緩存結果,否則執行方法內容,最後將方法執行結果保存到緩存中。

該註解有這些參數:valuecacheNameskeyconditionunlesskeyGeneratorcacheManagercacheResolver

valuecacheNames是兩個同等的參數。cacheNames是Spring4新增的,作爲value的別名,用於指定緩存對象,不是必須指定的。如果不指定則使用上面配置的CacheConfig配置的cacheNames

key就是緩存對象存儲在Map集合中的key值,不是必需,缺省按照方法的所有參數組合作 爲key值, 可以自己配置,但需要SpEL表達式。比如

@Cacheable(key = "#p0")    // 表示第一個參數作爲緩存的key值
getBlog(Integer id, String name){}
@Cacheable(key = "#id")    // 也可以用參數名作爲緩存的key值,這裏的參數是id
getBlog(Integer id, String name){}
@Cacheable(key = "#user.id")   // 甚至可以用對象裏的某個屬性作爲key值
getBlog(Integer id, User user){}

condition緩存對象的條件,非必需,也需使用SpEL表達式,只有滿足表達式條件的內容纔會被緩存。比如

@Cacheable(key = "#p0",condition = "#username.lenth < 3")
getBlog(Integer id, String username){}		// 只有第二個參數長度小於3的時候才緩存進去

unlesscondition相似,但unless是方法被調用之後才做判斷的,所以可以對結果result進行判斷是否去緩存。

keyGenerator用於指定key 生成器,非必需。
若需要指定一個自定義的key生成器,我們需要去實現 org.springframework.cache.interceptor.KeyGenerator接口,並使用該參數來指定

cacheManager用於指定使用哪個緩存管理器,非必需。只有當有多個緩存管理器時才需要使用。

cacheResolver用於指定使用那個緩存解析器,非必需。需通過 org.springframework.cache.interceptor.CacheResolver接口來實現自己的緩存解析器,並用該參數指定。

3、@CachePut

用於更新緩存,無論結果是否已經緩存,都會在方法執行結束插入緩存,相當於更新緩存,一般用於更新方法新增方法之上。其參數與@Cacheable類似。

4、@CacheEvict

配置於方法上,通常用在刪除方法上,用來從緩存中移除相應數據。 除了同@Cacheable一樣的參數之外,它還有下面兩個參數:
allEntries,非必需,默認爲false。當爲true時,會移除對應緩存對象的所有緩存數據,也就是移除cacheNamevalue指定的對象的緩存數據。
beforeInvocation,非必需, 默認爲false,會在調用方法之後移除數據。 當爲 true時,會在調用方法之前移除數據。

5、總結

一般來說,我們都在Service實現層的類上面使用@CacheConfig來指定公共緩存配置,在查詢的方法上使用@Cacheable,在新增/修改的方法上使用@CachePut,在刪除的方法上使用@CacheEvict

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章