SpringBoot高級 緩存

1.快速體驗緩存

  1)開啓基於註解的緩存   @EnableCaching

  2)   開啓緩存註解即可

          @Cacheable

          @CacheEvict

          @CachePut

 

2. @Cacheable初體驗

     CacheManager管理多個Cache組件的,對緩存的真正CRUD操作在Cache組件中,每一個緩存組件有自己唯一一個名字;

     幾個屬性:

                cacheNames/value: 指定緩存組件的名字;將方法的返回結果放在哪個緩存中,是數組的方式;可以指定多個緩存;

                key :緩存數據使用的key可以用它來指定;默認是使用方法參數的值   方法的返回值

                           編寫SpEL   #id;參數id的值   #a0  #p0  #root.args[0]

                keyGenerator:  key的生成器;可以自己指定key的生成器的組件id

                key/keyGenerator ;  二選一使用

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

                condition: 指定符合條件的情況下才緩存;

                               condition = "#a0>1":第一個參數的值>1的時候才進行緩存

                unless:否定緩存;當unless指定的條件爲true,方法的返回值就不會被緩存;

                                       unless="#result==null"

                sync: 是否使用異步模式

 

    3.運行流程:

         @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生成key

         

    4.@CachePut:既調用方法,又更新緩存數據;同步更新緩存;

        修改了數據庫的某個數據,同時更新緩存;

        運行時機:

        1、先調用目標方法

        2、將目標方法的結果緩存起來

        3、@Cacheable的key是不能用#result,因爲它的運行時機是調用方法之前就要用key去查緩存

 

    5.@CacheEvict :緩存清除

          key:  指定要清除的數據

          allEntries = true : 指定清除這個緩存中所有的數據  

          beforeInvocation =  false  緩存的清除是否在方法之前執行,默認是在方法之後執行的

          beforeInvocation =  true    代表清除緩存是在方法運行之前執行,無論方法是否出現異常,緩存都清除

    

    6. @Caching:  定義複雜的緩存規則

@Caching(
         cacheable = {
                 @Cacheable(value = "emp",key = "#lastName" )
         },
         put = {
              @CachePut(value = "emp",key = "#result.id"),
              @CachePut(value = "emp",key = "#result.email")
         }
    )

       

    7.@CacheConfig(cacheNames="emp")  //抽取緩存的公共配置

 

    8. 整合redis :使用docker;

       1) 引入redis的starter

       2) 配置redis 

       3) 引入redis的starter,容器中保存的是RedisCacheManager,它幫我們創建RedisCache 來作爲緩存組件,RedisCache通過操作redis來緩存數據

       4)利用StringRedisTemplate;操作k-v都是字符串的  或者RedisTemplate操作k-v都是對象的來操作redis的五大數據類型

      

            

       5) 默認保存數據 k-v 都是Object;利用序列化保存,默認創建的 RedisCacheManager 操作redis的時候使用的是 RedisTemplate<Object,Object>,它默認使用jdk的序列化機制   

       6)可以通過自定義RedisTemplate來改變默認的序列化機制,譬如,採用json

 

 

 

     

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