@Cacheable關於快取的個人筆記

??lv:D^發表於2020-11-05

Cacheable工作原理

1.自動配置類:CacheAutoConfiguration
2.快取的配置類很多,預設生效的配置類為:

SimpleCacheConfiguration

3.給容器註冊了一個CacheManager:ConcurrentMapCacheManager
4.可以獲取和建立ConcurrentMapCache型別的快取元件;它的作用講資料儲存再ConcurrentMap中

執行流程

@Cacheable:

1.方法執行之前,先去查詢Cache(快取元件),按照cacheNames指定的名字獲取;(CacheManager先去獲取相應的快取),第一次獲取快取如果沒有Cache元件會自動建立

2.去Cache中查詢快取的內容,使用一個key,預設就是方法的引數

key是按照某種策略生成的;預設是使用keyGenerator生成的,預設使用SimplekeyGenerator生成可以;

SimplekeyGenerator生成key的預設策略

如果沒有引數:key = new SimpleKey();

如果有一個引數: key = 引數的值

如果有多個引數: key = new SimpleKey(params) ;(如果是一個封裝類也可以當作一個key)

3.沒有查到快取就呼叫目標方法;

4.將目標方法返回的結果,放進快取中;

@Cacheable標註的方法執行之前先來檢查快取中有沒有這個資料,預設按照引數的值去查詢快取,如果沒有就執行方法將結果放入快取,以後再來呼叫就可以直接使用快取中的資料

核心:

(1) 使用CacheManager(ConcurrentMapCacheManager)按照名字得到Cache(ConcurrentMapCache)元件

(2) key使用keyGenerator生成的,預設是SimpleKeyGenerator;

當然也可以自定義一個KeyGenerator,等等下面會寫到有

註解講解

@Cacheable

幾個屬性:

cacheNames/value:指定快取元件的名字;將方法的返回結果放在哪個快取中,是陣列的放是,可以指定多個快取

key:快取資料使用的key,可以指定預設使用方法引數的值

KeyGenerator:Key的生成器:可以自己指定Key的生成器的元件id

key/keyGenerator:二選一使用

package yan.test.config;

import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.lang.reflect.Method;
import java.util.Arrays;

@Configuration
public class MyCacheConfig {

    @Bean("MyKeyGenerator")//定義KeyGenerator的名字
    public KeyGenerator keyGenerator(){

        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                return method.getName()+"["+ Arrays.asList(objects) +"]";//返回一個自定義的名字 
            }
        };
    }
}

cacheManager:指定快取管理器;或者cacheResolver指定獲取解析器

condition:指定符合條件的情況下才快取,如condition = “#id>0” 為true 則產生快取

unless:與condition相反

sync:是否使用非同步模式

@Cacheput:

作用:既呼叫方法,又更新快取資料;

修改了資料庫的某個資料,同時更新快取;

在這裡插入圖片描述


在Controller層分別呼叫 查詢 和 更新功能

連續2次呼叫查詢功能

呼叫資料庫查詢只用了一次 第二次從快取中獲取 所以只顯示了一次 ‘查詢1’

在這裡插入圖片描述

接下來執行更新功能
在這裡插入圖片描述
通過postman更改了型別的引數

接下來在進行查詢 看看實際上快取有沒有進行替換
在這裡插入圖片描述

看結果 沒有出現 ‘查詢1’ 說明快取已經更替

注意Cacheable和CachePut的Key值要相同 值不相同無法進行快取資料更新

@CacheEvict

作用:快取清除

@CacheEvict(value = “要清除快取的key值”)

key:指定要清楚的資料

allEntries = true 指定清除這個快取中的所有資料

beforeInvocation = false(預設) :快取的清除是否在方法之前執行

預設代表快取清除操作是在方法執行之後執行;如果出現就不會清除

beforeInvocation = true :代表清除快取操作是在方法執行之前執行,無卵方法是否出現一次,快取都會被清除

資料

beforeInvocation = false(預設) :快取的清除是否在方法之前執行

預設代表快取清除操作是在方法執行之後執行;如果出現就不會清除

beforeInvocation = true :代表清除快取操作是在方法執行之前執行,無卵方法是否出現一次,快取都會被清除

相關文章