緩存與緩衝區
術語「緩衝區」和「緩存」每每能夠互換使用,可是請注意,它們表明不一樣的東西。傳統上,緩衝區用做數據在快實體和慢實體之間的中間臨時存儲,因爲一方必須等待另外一方(這會影響性能),緩衝區容許整個數據塊(而不是小塊)同時移動,從而緩解了這種狀況。數據只從緩衝區寫入和讀取一次,此外,至少有一方知道緩衝區是可見的。java
另外一方面,緩存根據定義是隱藏的,而且任何一方都不知道緩存的發生,它還提升了性能,可是經過讓相同的數據以快速方式屢次讀取來提升性能。git
你能夠在這裏找到關於緩衝區和緩存之間差別的進一步解釋。github
緩存抽象的核心是將緩存應用於Java方法,從而根據緩存中可用的信息減小執行的次數,也就是說,每次調用目標方法時,抽象都會應用緩存行爲,檢查給定參數的方法是否已經執行。若是已執行,則返回緩存的結果,而沒必要執行實際的方法,若是方法還沒有執行,則執行該方法,並緩存結果並返回給用戶,以便在下次調用該方法時返回緩存的結果。這樣,對於給定的一組參數,昂貴的方法(不管是CPU綁定的仍是IO綁定的)只能執行一次,而且結果能夠重用,而沒必要實際再次執行該方法,緩存邏輯被透明地應用,沒有任何對調用程序的干擾。spring
這種方法只適用於保證爲給定輸入(或參數)返回相同輸出(結果)的方法,不管執行了多少次。
緩存抽象提供了其餘與緩存相關的操做,好比更新緩存內容或刪除一個或全部條目的能力,若是緩存處理的數據在應用程序運行過程當中可能發生更改,那麼這些方法很是有用。編程
與其餘在Spring Framework中的服務,緩存服務是一個抽象(不是緩存實現),須要使用實際的存儲來存儲緩存數據 — 也就是說,抽象使你沒必要寫緩存邏輯但不提供實際的數據存儲。這個抽象是由org.springframework.cache.Cache
和org.springframework.cache.CacheManager
接口實現。緩存
Spring提供了該抽象的一些實現:JDK 基於緩存的java.util.concurrent.ConcurrentMap
、Ehcache 2.x、Gemfire緩存、Caffeine和JSR-107兼容緩存(例如Ehcache 3.x)。多線程
緩存抽象對多線程和多進程環境沒有特殊的處理,由於這些特性是由緩存實現來處理的。
若是你有一個多進程環境(即部署在多個節點上的應用程序),則須要相應地配置緩存提供程序,根據你的用例,在多個節點上覆制相同的數據就足夠了,可是,若是在應用程序過程當中更改數據,則可能須要啓用其餘傳播機制。性能
緩存特定的項與經過編程緩存交互找到的典型get-if-not-found-then- proceed-and-put-eventually代碼塊是直接等價的,沒有應用鎖,幾個線程可能試圖同時加載相同的項,這一樣適用於驅逐。若是多個線程試圖同時更新或驅逐數據,則可使用陳舊數據,某些緩存提供程序在該領域提供高級特性,有關詳細信息,請參閱緩存提供程序的文檔。線程
要使用緩存抽象,你須要考慮兩個方面:code