最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Spring三級緩存

 更新時間:2025年06月04日 09:37:49   作者:?abc!  
三級緩存就是在Bean生成流程中保存Bean對象三種形態(tài)的三個Map集合,這個三級緩存就是為了解決循環(huán)依賴,本文給大家介紹Java Spring三級緩存,感興趣的朋友一起看看吧

三級緩存是指什么

我們常說的三級緩存如下:

  • CPU三級緩存
  • Spring三級緩存
  • 應用架構(JVM、分布式緩存、db)三級緩存

CPU

基本概念

CPU 的訪問速度每 18 個月就會翻 倍,相當于每年增? 60% 左右,內(nèi)存的速度當然也會不斷增?,但是增?的速度遠小于 CPU,平均每年 只增? 7% 左右。于是,CPU 與內(nèi)存的訪問性能的差距不斷拉大。

為了彌補 CPU 與內(nèi)存兩者之間的性能差異,就在 CPU 內(nèi)部引入了 CPU Cache,也稱高速緩存

CPU Cache 通常分為大小不等的三級緩存,分別是 L1 Cache、L2 Cache 和 L3 Cache。其中L3是多個核心共享的

離 CPU 核心越近,緩存的讀寫速度就越快
但 CPU 的空間很狹小,離 CPU 越近緩存大小受到的限制也越大。

所以,綜合硬件布局、性能等因素,CPU 緩存通常分為大小不等的三級緩存。

  • 三級緩存要比一、二級緩存大許多倍,這是因為當下的 CPU 都是多核心的,
  • 每個核心都有自己的一、二級緩存,
  • 三級緩存卻是一顆 CPU 上所有核心共享的
  • 緩存一致性:在多核CPU時代,CPU有“緩存一致性”原則,也就是說每個處理器(核)都會通過嗅探在總線上傳播的數(shù)據(jù)來檢查自己的緩存值是不是過期了。如果過期了,則失效。
    • 比如聲明volitate,當變量被修改,則會立即要求寫入系統(tǒng)內(nèi)存。

程序執(zhí)行數(shù)據(jù)流向

順序如下

  • 先將內(nèi)存中的數(shù)據(jù)加載到共享的 L3 Cache 中,
  • 再加載到每個核心獨有的 L2 Cache,
  • 最后 進入到最快的 L1 Cache,之后才會被 CPU 讀取。
  • 之間的層級關系,如下圖。

Spring三級緩存

概述

三級緩存就是在Bean生成流程中保存Bean對象三種形態(tài)的三個Map集合
]
這個三級緩存就是為了解決循環(huán)依賴

  • 當創(chuàng)建相互依賴的對象時,會形成死循環(huán),例如下圖無緩存中的情況。

  • 而Spring通過增加緩存,將未完全創(chuàng)建好的A提前暴露在緩存中,當相互依賴的對象B對屬性A賦值時,可以直接從緩存中獲取A,而不需要再創(chuàng)建A。如下所示

哪三個緩存

Spring三級緩存機制包括以下三個緩存:

  • singletonObjects:一級緩存,緩存中的bean是已經(jīng)創(chuàng)建完成的,該bean經(jīng)歷過實例化->屬性填充->初始化以及各種的后置處理。因此,一旦需要獲取bean時,會優(yōu)先尋找一級緩存
  • ???????earlySingletonObjects:二級緩存,該緩存跟一級緩存的區(qū)別在于,該緩存所獲取到的bean是提前曝光出來的,是還沒創(chuàng)建完成的。也就是說獲取到的bean只能確保已經(jīng)進行了實例化,但是屬性填充跟初始化還沒有做完,因此該bean還沒創(chuàng)建完成,時半成品,僅僅能作為指針提前曝光,被其他bean所引用
  • singletonFactories:三級緩存,在bean實例化完之后,屬性填充以及初始化之前,如果允許提前曝光,spring會將實例化后的bean提前曝光,也就是把該bean轉換成beanFactory并加入到三級緩存在需要引用提前曝光對象時再通過singletonFactory.getObject()獲取。
// 一級緩存Map 存放完整的Bean(流程跑完的)
private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
// 二級緩存Map 存放不完整的Bean(只實例化完,還沒屬性賦值、初始化)
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);
// 三級緩存Map 存放一個Bean的lambda表達式(也是剛實例化完)
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);

發(fā)現(xiàn)兩個Bean循環(huán)依賴時

當Spring發(fā)現(xiàn)兩個或更多個bean之間存在循環(huán)依賴關系時

  • 它會先將其中一個beanA創(chuàng)建的過程中尚未完成的實例放入earlySingletonObjects緩存中,
  • 然后將創(chuàng)建該beanA的工廠對象放入singletonFactories緩存中。
  • 接著,Spring會暫停當前bean的創(chuàng)建過程,去創(chuàng)建它所依賴的bean。
  • 當依賴的bean創(chuàng)建完成后,Spring會將其放入singletonObjects緩存中,并使用它來完成當前bean的創(chuàng)建過程。
  • 在創(chuàng)建當前bean的過程中,如果發(fā)現(xiàn)它還依賴其他的bean,Spring會重復上述過程,直到所有bean的創(chuàng)建過程都完成為止。
  • 注意:當使用構造函數(shù)注入方式時,循環(huán)依賴是無法解決的。
    • 因為在創(chuàng)建bean時,必須先創(chuàng)建它所依賴的bean實例,而構造函數(shù)注入方式需要在創(chuàng)建bean實例時就將依賴的bean實例傳入構造函數(shù)中。
    • 如果依賴的bean實例尚未創(chuàng)建完成,就無法將其傳入構造函數(shù)中,從而導致循環(huán)依賴無法解決。
    • 此時,可以考慮使用setter注入方式來解決循環(huán)依賴問題。

當A和B相互依賴時,若先創(chuàng)建實例A,則整個調(diào)用過程如下:

簡化圖如下

應用架構三級緩存

概述

應用架構三級緩存的時候,一般說JVM級別的、分布式緩存級別的、數(shù)據(jù)庫級別

  • JVM級別:一般常見本地緩存框架有Guava Cache和Caffeine Cache
  • 分布式緩存級別:一般用的Redis。
  • 數(shù)據(jù)庫級別mysql等數(shù)據(jù)庫

眾所周知 MySQL 數(shù)據(jù)庫會將數(shù)據(jù)存儲在硬盤以防止掉電丟失,但是受制于硬盤的物理設計,即便是目前性能最好的企業(yè)級 SSD 硬盤,也比內(nèi)存的這種高速設備 IO 層面差一個數(shù)量級
典型的 “讀多寫少” 的場景,需要在設計上進行數(shù)據(jù)的讀寫分離,數(shù)據(jù)寫入時直接落盤處理,
占比超過 90% 的數(shù)據(jù)讀取操作時則從以 Redis 為代表的內(nèi)存 NoSQL 數(shù)據(jù)庫提取數(shù)據(jù),利用內(nèi)存的高吞吐瞬間完成數(shù)據(jù)提取,這里 Redis 的作用就是我們常說的緩存。

二級緩存架構

二級緩存架構

  • 1級為本地緩存,或者進程內(nèi)的緩存(如 Ehcache) —— 速度快,進程內(nèi)可用
  • ???????2級為集中式緩存(如 Redis)—— 可同時為多節(jié)點提供服務

?????????????? Java 的應用端多級緩存

  • 在 Java 的應用端也要設計多級緩存,我們將進程內(nèi)緩存與分布式緩存服務結合,有效分攤應用壓力。
  • Java 應用層面,只有 本地緩存(EhCache、Caffeine Cache) 的緩存不存在時,再去 Redis 分布式緩存獲取
  • 果 Redis 也沒有此數(shù)據(jù)再去數(shù)據(jù)庫查詢,數(shù)據(jù)查詢成功后對 Redis 與 本地緩存 同時進行雙寫更新。
  • 這樣 Java 應用下一次再查詢相同數(shù)據(jù)時便直接從本地緩存提取,不再產(chǎn)生新的網(wǎng)絡通信,應用查詢性能得到顯著提高。
  • 為了保證緩存一致性,利用 通知(MQ、發(fā)布訂閱模式等) 向其他服務實例以及 Redis 緩存服務發(fā)起變更通知。

到此這篇關于三級緩存的文章就介紹到這了,更多相關三級緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • PostConstruct注解標記類ApplicationContext未加載空指針

    PostConstruct注解標記類ApplicationContext未加載空指針

    這篇文章主要為大家介紹了@PostConstruct注解標記類ApplicationContext未加載空指針示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Java 響應式編程之Spring WebFlux+Reactor 實戰(zhàn)攻略

    Java 響應式編程之Spring WebFlux+Reactor 實戰(zhàn)攻略

    本文詳細介紹了Java響應式編程的核心概念,重點講解了SpringWebFlux框架與Reactor響應式庫的實戰(zhàn)用法,通過大量可運行的示例代碼,幫助讀者快速上手并理解響應式編程的精髓,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • java類中元素初始化順序詳解

    java類中元素初始化順序詳解

    對于靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構造器,它們的初始化順序依次是(靜態(tài)變量、靜態(tài)初始化塊)>(變量、初始化塊)>構造器
    2013-08-08
  • JDBC插入數(shù)據(jù)返回數(shù)據(jù)主鍵代碼實例

    JDBC插入數(shù)據(jù)返回數(shù)據(jù)主鍵代碼實例

    這篇文章主要介紹了JDBC插入數(shù)據(jù)返回數(shù)據(jù)主鍵代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Java中單元測試框架JUnit知識點整理

    Java中單元測試框架JUnit知識點整理

    在Java開發(fā)中JUnit是最常用的單元測試框架之一,編寫JUnit測試的目的是確保代碼的正確性、可維護性和可擴展性,這篇文章主要介紹了Java中單元測試框架JUnit知識點整理的相關資料,需要的朋友可以參考下
    2025-08-08
  • Spring中容器的創(chuàng)建流程詳細解讀

    Spring中容器的創(chuàng)建流程詳細解讀

    這篇文章主要介紹了Spring中容器的創(chuàng)建流程詳細解讀,Spring?框架其本質(zhì)是作為一個容器,提供給應用程序需要的對象,了解容器的誕生過程,有助于我們理解?Spring?框架,也便于我們“插手”這個過程,需要的朋友可以參考下
    2023-10-10
  • 簡述Mybatis增刪改查實例代碼

    簡述Mybatis增刪改查實例代碼

    本文給大家分享編寫一個簡單的mybatis進行插入數(shù)據(jù)的實例代碼,非常不錯具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-10-10
  • Java?Swing實現(xiàn)自定義彈窗組件CusDialog(附源碼)

    Java?Swing實現(xiàn)自定義彈窗組件CusDialog(附源碼)

    Swing 原生對話框 JDialog 和 JFrame 一樣,標題欄是系統(tǒng)自帶的,樣式陳舊且無法自定義,下面我們就來看看如何通過Java Swing實現(xiàn)自定義彈窗組件CusDialog吧
    2026-05-05
  • Java Web開發(fā)中過濾器和監(jiān)聽器使用詳解

    Java Web開發(fā)中過濾器和監(jiān)聽器使用詳解

    這篇文章主要為大家詳細介紹了Java中的過濾器Filter和監(jiān)聽器Listener的使用以及二者的區(qū)別,文中的示例代碼講解詳細,需要的可以參考一下
    2022-10-10
  • SpringBoot中屬性賦值操作的實現(xiàn)

    SpringBoot中屬性賦值操作的實現(xiàn)

    這篇文章主要介紹了SpringBoot中屬性賦值操作的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10

最新評論

新竹县| 武冈市| 咸宁市| 江陵县| 太和县| 繁峙县| 阳西县| 抚松县| 道真| 淳化县| 阳春市| 黑龙江省| 安徽省| 油尖旺区| 营口市| 平顶山市| 翁牛特旗| 泸溪县| 闻喜县| 中方县| 邮箱| 通榆县| 蓬莱市| 巴马| 竹溪县| 阿瓦提县| 盐亭县| 于田县| 通许县| 巫溪县| 阜平县| 乌海市| 壶关县| 拜城县| 毕节市| 奎屯市| 铁岭县| 关岭| 图木舒克市| 体育| 南和县|