Spring框架學習之Cache抽象詳解
官方文檔 8.0
Spring為不同緩存做瞭一層抽象,這裡通過閱讀文檔以及源碼會對使用以及原理做一些學習筆記。
1.簡介
從3.1版開始,Spring Framework提供瞭對現有Spring應用程序透明地添加緩存的支持。 與事務支持類似,緩存抽象允許一致地使用各種緩存解決方案,而對代碼的影響最小。
從Spring 4.1開始,通過JSR-107註釋和更多自定義選項的支持,緩存抽象得到瞭顯著改進。
cache和buffer
從術語上看,”buffer”和”cache”,可以互相被替換.但是,他們確實代表著不同的事情.
傳統上,一個buffer被用來作為快數據和慢數據之間的臨時存儲.因為快速的一方需要等待慢的一方(會影響性能),buffer通過允許整塊數據一次移動而不是一小塊數據一點一點移動來緩解壓力. 這個數據隻會從buffer中被寫入或者讀出一次.此外,buffers對總對一方可以見.
Cache,則相反,通過定義,隱藏,並且不會讓對方意識到它的存在.它同樣提高性能,但是這是讓相同數據在同時以快速的方式被多次讀取來實現的.
2.緩存抽象
緩存抽象的核心是將緩存應用於Java方法,從而減少瞭基於緩存中可用信息的執行次數。也就是說,每次調用目標方法時,抽象都會應用緩存行為檢查方法是否已經為給定的參數執行。如果有,則返回緩存的結果,而不必執行實際的方法;如果沒有,則執行方法,緩存結果並返回給用戶,以便在下次調用方法時返回緩存的結果。這樣,對於給定的一組參數,昂貴的方法(CPU或IO綁定)隻能執行一次,並且結果可以重用,而不必實際再次執行該方法。緩存邏輯被透明地應用,沒有任何對調用程序的幹擾。
緩存抽象提供瞭其他緩存相關的操作,比如更新緩存的內容或者刪除一個或者全部.如果緩存在處理數據的過程中經常改變,這些操作將非常有用.
就像Spring Framework中的其他服務一樣,緩存服務是一種抽象(不是緩存實現),需要使用實際存儲來存儲緩存數據 – 也就是說,抽象使開發人員不必編寫緩存相關邏輯,但它也不提供實際的數據存儲能力。
通過接口 org.springframework.cache.Cache(緩存)
和org.springframework.cache.CacheManager(緩存管理器) 實現緩存的抽象
這個抽象的一些實現可以直接使用:基於JDK java.util.concurrent.ConcurrentMap的緩存(即默認的緩存是基於JVM的ConcurrentMap),Ehcache 2.x,Gemfire緩存,Caffeine,符合和JSR-107的緩存(例如Ehcache 3.x)。 有關插入其他緩存存儲/提供程序的更多信息,請參閱插入不同的後端緩存。
3.spring緩存抽象與多進程
註意的是:
Spring的緩存抽象沒有特別處理多線程或者多進程,這些都是緩存的實現來處理的。
如果你有多進程環境(一個應用部署在多個節點上),你需要配置相應地提供你緩存的程序.根據你的用例,從多個節點上拷貝相通數據就足夠瞭.然而,如果在應用的過程中修改瞭數據,則需要有其他的機制來通知修改.
緩存一個專門的對象是一個與典型的get-if-not-found-then- proceed-and-put-eventually代碼塊等價,是通過編程緩存交互找到.沒有鎖被使用,多個線程並發的獲取相同的數據.刪除(eviction)也同樣如此.如果多個線程嘗試並發的更新或者刪除數據,你也許就使用瞭過時(stale)的數據.一些緩存提供方提供瞭更加高級的特性.從文檔中可以看到更多的細節.
使用緩存你需要從兩方面看起:
- 聲明緩存:確認需要被緩存的方法還有他們使用的策略
- 配置緩存: 存儲數據然後把數據讀到緩存中.
以上就是Spring框架學習之Cache抽象詳解的詳細內容,更多關於Spring框架Cache抽象的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- SpringBoot+SpringCache實現兩級緩存(Redis+Caffeine)
- spring緩存cache的使用詳解
- 詳談@Cacheable不起作用的原因:bean未序列化問題
- 詳解高性能緩存Caffeine原理及實戰
- SpringBoot詳解整合Redis緩存方法