理解快取抽象

快取 vs 緩衝區

“緩衝區”(buffer)和“快取”(cache)這兩個術語往往可以互換使用。然而,請注意它們代表著不同的事物。傳統上,緩衝區被用作快速實體和慢速實體之間資料的中間臨時儲存。由於一方必須等待另一方(這會影響效能),緩衝區透過允許一次移動整個資料塊而不是小塊資料來緩解這種情況。資料只從緩衝區寫入和讀取一次。此外,緩衝區對至少一個瞭解它的實體是可見的。

另一方面,快取,根據定義,是隱藏的,雙方都不知道快取正在發生。它也提高了效能,但透過允許相同的資料以快速的方式多次讀取來實現。

你可以在此處找到關於緩衝區和快取之間差異的進一步解釋。

其核心在於,快取抽象將快取應用於 Java 方法,從而根據快取中可用的資訊減少執行次數。也就是說,每次呼叫目標方法時,抽象都會應用快取行為,檢查該方法是否已針對給定引數被呼叫。如果已呼叫,則直接返回快取結果,無需呼叫實際方法。如果方法尚未呼叫,則呼叫該方法,並將結果快取並返回給使用者,以便下次呼叫該方法時,返回快取結果。透過這種方式,開銷大的方法(無論是 CPU 密集型還是 IO 密集型)對於給定的一組引數只需呼叫一次,結果即可重複使用,而無需再次實際呼叫該方法。快取邏輯透明地應用,不會對呼叫者造成任何干擾。

這種方法僅適用於那些無論呼叫多少次,都保證針對給定輸入(或引數)返回相同輸出(結果)的方法。

快取抽象提供了其他與快取相關的操作,例如更新快取內容或刪除一個或所有條目的能力。如果快取處理的資料在應用程式執行過程中可能發生變化,這些操作會很有用。

與 Spring 框架中的其他服務一樣,快取服務是一種抽象(而不是快取實現),需要使用實際儲存來儲存快取資料——也就是說,該抽象使你無需編寫快取邏輯,但它不提供實際的資料儲存。這種抽象由 org.springframework.cache.Cacheorg.springframework.cache.CacheManager 介面實現。

Spring 提供了該抽象的一些實現:基於 JDK java.util.concurrent.ConcurrentMap 的快取、Gemfire 快取、Caffeine 以及符合 JSR-107 標準的快取(例如 Ehcache 3.x)。有關插入其他快取儲存和提供程式的資訊,請參閱插入不同的後端快取

快取抽象對多執行緒和多程序環境沒有特殊處理,因為此類功能由快取實現負責處理。

如果您處於多程序環境(即,應用程式部署在多個節點上),您需要相應地配置您的快取提供程式。根據您的用例,在多個節點上覆制相同的資料可能就足夠了。但是,如果您在應用程式執行過程中更改資料,您可能需要啟用其他傳播機制。

快取特定項直接等同於透過程式設計快取互動找到的典型“get-if-not-found-then-proceed-and-put-eventually”程式碼塊。不應用鎖,並且多個執行緒可能嘗試併發載入同一項。驅逐也適用相同的情況。如果多個執行緒嘗試併發更新或驅逐資料,您可能會使用過時的資料。某些快取提供程式在該領域提供高階功能。有關更多詳細資訊,請參閱您的快取提供程式的文件。

要使用快取抽象,您需要注意兩個方面

  • 快取宣告:識別需要快取的方法及其策略。

  • 快取配置:儲存資料並從中讀取資料的後端快取。

© . This site is unofficial and not affiliated with VMware.