1. 程式人生 > 實用技巧 >springboot整合快取

springboot整合快取

一、搭建基本環境
1、匯入資料庫檔案 創建出department和employee表
2、建立javaBean封裝資料
3、整合MyBatis操作資料庫
1.配置資料來源資訊
2.使用註解版的MyBatis;
1)、@MapperScan指定需要掃描的mapper介面所在的包
二、快速體驗快取
步驟:
1、開啟基於註解的快取 @EnableCaching
2、標註快取註解即可
@Cacheable
@CacheEvict
@CachePut
預設使用的是ConcurrentMapCacheManager==ConcurrentMapCache;將資料儲存在 ConcurrentMap<Object, Object>中
開發中使用快取中介軟體;redis、memcached、ehcache;
三、整合redis作為快取
Redis 是一個開源(BSD許可)的,記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。
1、安裝redis:使用docker;
2、引入redis的starter
3、配置redis
4、測試快取
原理:CacheManager===Cache 快取元件來實際給快取中存取資料
1)、引入redis的starter,容器中儲存的是 RedisCacheManager;
2)、RedisCacheManager 幫我們建立 RedisCache 來作為快取元件;RedisCache通過操作redis快取資料的
3)、預設儲存資料 k-v 都是Object;利用序列化儲存;如何儲存為json
1、引入了redis的starter,cacheManager變為 RedisCacheManager;
2、預設建立的 RedisCacheManager 操作redis的時候使用的是 RedisTemplate<Object, Object>
3、RedisTemplate<Object, Object> 是 預設使用jdk的序列化機制
4)、自定義CacheManager;

@Cacheable
將方法的執行結果進行快取;以後再要相同的資料,直接從快取中獲取,不用呼叫方法;
CacheManager管理多個Cache元件的,對快取的真正CRUD操作在Cache元件中,每一個快取元件有自己唯一一個名字;


原理:
  1、自動配置類;CacheAutoConfiguration
  2、快取的配置類
  org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
  org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration
  org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
  org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
  org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
  org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
  org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
  org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
  org.springframework.boot.autoconfigure.cache.GuavaCacheConfiguration
  org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration【預設】
  org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration
  
3、哪個配置類預設生效:SimpleCacheConfiguration; 4、給容器中註冊了一個CacheManager:ConcurrentMapCacheManager 5、可以獲取和建立ConcurrentMapCache型別的快取元件;他的作用將資料儲存在ConcurrentMap中; 執行流程: @Cacheable: 1、方法執行之前,先去查詢Cache(快取元件),按照cacheNames指定的名字獲取; (CacheManager先獲取相應的快取),第一次獲取快取如果沒有Cache元件會自動建立。 2、去Cache中查詢快取的內容,使用一個key,預設就是方法的引數; key是按照某種策略生成的;預設是使用keyGenerator生成的,預設使用SimpleKeyGenerator生成key; SimpleKeyGenerator生成key的預設策略; 如果沒有引數;key
=new SimpleKey(); 如果有一個引數:key=引數的值 如果有多個引數:key=new SimpleKey(params); 3、沒有查到快取就呼叫目標方法; 4、將目標方法返回的結果,放進快取中 @Cacheable標註的方法執行之前先來檢查快取中有沒有這個資料,預設按照引數的值作為key去查詢快取, 如果沒有就執行方法並將結果放入快取;以後再來呼叫就可以直接使用快取中的資料; 核心: 1)、使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】元件 2)、key使用keyGenerator生成的,預設是SimpleKeyGenerator 幾個屬性: cacheNames/value:指定快取元件的名字;將方法的返回結果放在哪個快取中,是陣列的方式,可以指定多個快取; key:快取資料使用的key;可以用它來指定。預設是使用方法引數的值 1-方法的返回值 編寫SpEL; #i d;引數id的值 #a0 #p0 #root.args[0] getEmp[2] keyGenerator:key的生成器;可以自己指定key的生成器的元件id key/keyGenerator:二選一使用; cacheManager:指定快取管理器;或者cacheResolver指定獲取解析器 condition:指定符合條件的情況下才快取; ,condition = "#id>0" condition = "#a0>1":第一個引數的值》1的時候才進行快取 unless:否定快取;當unless指定的條件為true,方法的返回值就不會被快取;可以獲取到結果進行判斷 unless = "#result == null" unless = "#a0==2":如果第一個引數的值是2,結果不快取; sync:是否使用非同步模式