91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot怎樣進行緩存

發布時間:2021-09-29 16:09:17 來源:億速云 閱讀:118 作者:柒染 欄目:編程語言

SpringBoot怎樣進行緩存,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

緩存技術是一個讓所有開發人員又愛又恨的技術,我們愛緩存是因為緩存能給我們帶來數量級的響應和流量,但是最迷人的反而最危險,如果緩存用不好也是災難級別的,特別是一些涉及到公司主要現金流的業務,如果因為我們使用緩存不當,而帶給公司一定的損失,不亞于刪庫跑路的那個大兄弟,那今天我們就來看一下springboot的緩存都有那些東西,學習嘛,一點點的來,慢慢積累自己的經驗,才能厚積薄發

一、JSR107緩存規范

為了緩存開發規范的統一,以及提升系統的擴展性,J2EE發布了JSR107緩存規范。 主要是Java Caching定義了5個接口,分別是CachingProvider、CacheManager、Cache、Entry、Expiry。

下面我們分開詳細的展開看一下

  • CachingProvider:

  • 可以創建、配置、獲取、管理和控制多個CacheManager,一個Application在運行期間可以訪問多個CachingProvider。

  • CacheManager:

  • 可以創建、配置、獲取、管理和控制多個唯一命名的Cache,這些Cache存在于CacheManager的上下文中。一個CacheManager僅被一個CachingProvider所擁有。

  • Cache:

  • 是一個類似于Map的數據結構并臨時存儲以Key為索引的值。一個Cache僅被一個CacheManager所擁有。

  • Entry:

  • 是存儲在Cache中的Key-Value對。

  • Expiry:

  • 每一個緩存在Cache中的條目有一個定義的有效期,一旦超過這個時間,該條目就為過期狀態,一旦過期,條目將不可訪問、更新和刪除。其中緩存的有效期可以通過ExpiryPolicy設置。

  • 如果說這樣講解讓你有點蒙圈的話,那沒關系,我們看下面這張圖

SpringBoot怎樣進行緩存

簡單總結一下就是:一個應用里面可以有多個緩存提供者(CachingProvider),一個緩存提供者可以獲取到多個緩存管理器(CacheManager),一個緩存管理器管理著不同的緩存(Cache),緩存中是一個個的緩存鍵值對(Entry),每個entry都有一個有效期(Expiry)。緩存管理器和緩存之間的關系有點類似于數據庫中連接池和連接的關系。

二、SpringBoot緩存抽象

在我自己看來,沒有源碼所有的理論講解,都是空談,或者說就是扯淡,所以我們來看一下,緩存的源碼級操作

Spring從3.1版本開始定義了org.springframework.cache.CacheManagerorg.springframework.cache.Cache接口來統一不同的緩存技術,并支持使用JSR-107注解簡化開發。 在IDEA中,使用Spring Initializr快速創建Spring Boot項目時,勾選中Cache后,在配置文件中配置debug=true,可以查看Spring Boot的自動配置項。 其中關于緩存的配置類如下:

org.springframework.boot.autoconfigure.cache.GenericCacheConfigurationorg.springframework.boot.autoconfigure.cache.JCacheCacheConfigurationorg.springframework.boot.autoconfigure.cache.EhCacheCacheConfigurationorg.springframework.boot.autoconfigure.cache.HazelcastCacheConfigurationorg.springframework.boot.autoconfigure.cache.InfinispanCacheConfigurationorg.springframework.boot.autoconfigure.cache.CouchbaseCacheConfigurationorg.springframework.boot.autoconfigure.cache.RedisCacheConfigurationorg.springframework.boot.autoconfigure.cache.CaffeineCacheConfigurationorg.springframework.boot.autoconfigure.cache.GuavaCacheConfigurationorg.springframework.boot.autoconfigure.cache.SimpleCacheConfigurationorg.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration

啟動項目后,可以在控制臺看到匹配到的只有SimpleCacheConfiguration這個自動配置類,而在SimpleCacheConfiguration類中,使用@Bean注解給容器中注冊了一個CacheManager,由此可看Spring Boot默認的CacheManager是ConcurrentMapCacheManager。

 SimpleCacheConfiguration matched:      - Cache org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration automatic cache type (CacheCondition)      - @ConditionalOnMissingBean (types: org.springframework.cache.CacheManager; SearchStrategy: all) did not find any beans (OnBeanCondition)

同樣的,我們通過一張圖形象的展示一下看看

SpringBoot怎樣進行緩存

進入@Caching的源碼可以看到,在組合注解內可以使用cacheable、put、evict

public @interface Caching {    Cacheable[] cacheable() default {};    CachePut[] put() default {};    CacheEvict[] evict() default {};}

@Caching的使用

 @Caching(            cacheable = {                    @Cacheable(key = "#name")            },            put = {                    @CachePut(key = "#result.id"),                    @CachePut(key = "#result.cNo")            }    )

@Cacheable、@CachePut、@CacheEvict中的主要參數

key

#緩存的key,可以為空,也可以使用SpEL表達式編寫例:@Cacheable(value=“stu”,key=“userName”)

condition

#緩存的條件,可以為空,也可以使用SpEL表達式編寫,只有為true才緩存/清除緩存,#不管方法執行前后都可以判斷例:@Cacheable(value=“stu”,condition=“userName.length()>2”)

unless

#用于否定緩存,只在方法執行之后判斷,也可以使用SpEL表達式編寫#true不緩存,false才緩存例:@Cacheable(value=“stu”,unless=“userName == null”)
  • @Cacheable

  • 標注的方法執行之前,先查看緩存中有沒有這個數據,默認按照參數的值作為key去緩存中查找。如果沒有就運行這個方法并將方法的執行結果放入緩存中,之后再調用該方法時,直接使用緩存中的數據即可。

  • @CachePut

  • 標注的方法必須要執行,它的運行時機是,先調用目標方法,然后將目標方法的結果放入緩存中,但是更新緩存中的數據時,要注意key值,否則緩存中的數據無法更新。

  • @CacheEvict

  • 這個注解中allEntries = true代表要清除某個緩存中的所有數據。beforeInvocation = false代表緩存的清除在方法執行之后執行,如果出現異常等情況,則不會清除緩存中的數據。這是@CacheEvict

  • 注解默認的。beforeInvocation = true代表緩存的清除在方法執行之前執行,出現異常等情況,也會清除緩存中的數據。

  • key的生成策略

  • key的生成默認使用SimpleKeyGenerator生成的,而SimpleKeyGenerator的生成策略有:如果沒有參數:key=new SimpleKey();如果有一個參數:key=參數的值如果有多個參數:key=new SimpleKey(params);

看完上述內容,你們掌握SpringBoot怎樣進行緩存的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

额敏县| 武清区| 苍南县| 丹江口市| 遵义县| 太保市| 屯留县| 南木林县| 四会市| 新蔡县| 崇文区| 北京市| 炎陵县| 扎赉特旗| 岗巴县| 庆云县| 行唐县| 尤溪县| 金沙县| 昌图县| 资源县| 辉南县| 上蔡县| 米林县| 皋兰县| 宁德市| 茌平县| 无锡市| 会昌县| 丹江口市| 许昌县| 田阳县| 永胜县| 梧州市| 滕州市| 文登市| 逊克县| 台州市| 丰县| 息烽县| 公主岭市|