註解@Cacheable和@CachePut都可以保存緩存鍵值對,只是它們的方式略有不同,請注意二者的區別,它們只能運用於有返回值的方法中,而刪除緩存key的@CacheEvict則可以用在void的方法上,因爲它並不需要去保存任何值。
- @Cacheable:表明在進入方法之前,Spring會先去緩存服務器中查找對應key的緩存值,如果找到緩存值,那麼Spring將不會再調用方法,而是將緩存值讀出,返回給調用者;如果沒有找到緩存值,那麼Spring就會執行你的方法,將最後的結果通過key保存在緩存服務器中。
- @CachePut:Spring會將方法返回的值緩存到緩存服務器中,這裏需要注意,Spring不會事先去緩存服務器中查找,而是直接執行方法,然後緩存。
- @CacheEvict:移除緩存對應的key的值。
- @Caching:這是一個分組註釋,它能夠同時應用於其他緩衝的註解。
一般而言,對於查詢,我們會考慮使用@Cacheable,對於插入和修改,我們會考慮使用@CachePut,對於刪除,我們會考慮採用使用@CacheEvict。
註解@Cacheable和@CachePut
它們的屬性:
- value:使用緩存的名稱。
- condition:Spring表達式,如果表達式返回值爲false,則不會將緩存應用到方法中,true則會。
- key:Spring表達式,可以通過它來計算對應的緩存的key。
- unless:Spring表達式,如果表達式返回值爲true,則不會將方法的結果放到緩存上。
其中,因爲value和key這兩個熟悉使用得最多,所以先來討論這兩個屬性。value是一個數組,可以引用多個緩存管理器,而對於key則是緩存中的鍵,它支持Spring表達式,通過Spring表達式就可以自定義緩存的key。
註解@CacheEvict
註解@CacheEvict主要是爲了移除緩存的鍵值對,主要對於那些刪除的操作,先來了解它存在哪些屬性。
value和key與之前的@Cacheable和@CachePut是一致的,而屬性allEntries要求刪除緩存服務器中所有的緩存,這個時候指定的key將不會生效,所以這個屬性要慎用。
- value:要使用緩存的名稱
- key:指定String表達式返回緩存的key
- condition:指定String表達式,如果返回爲true,則執行移除緩存,否則不執行。
- allEntries:如果爲true,則刪除特定緩存所有的鍵值對,默認值爲false。
- beforeInvocation:指定在方法前後移除緩存,如果指定爲true,則在方法前刪除緩存;如果爲false,則在方法調用後刪除緩存。