https://spring.io/guides/gs/caching-gemfire/的示例顯示,如果存在緩存未命中,我們必須從服務器獲取數據並將其存儲在緩存中。Gemfire彈簧示例
這是Gemfire作爲Gemfire服務器運行的例子,還是Gemfire客戶端?我認爲如果存在緩存未命中,客戶端會自動從服務器獲取數據。如果是這樣的話,會不會有客戶端的緩存未命中?
問候,
佳日
https://spring.io/guides/gs/caching-gemfire/的示例顯示,如果存在緩存未命中,我們必須從服務器獲取數據並將其存儲在緩存中。Gemfire彈簧示例
這是Gemfire作爲Gemfire服務器運行的例子,還是Gemfire客戶端?我認爲如果存在緩存未命中,客戶端會自動從服務器獲取數據。如果是這樣的話,會不會有客戶端的緩存未命中?
問候,
佳日
首先,我認爲你缺少核心Spring框架的Cache Abstraction點。我鼓勵您閱讀更多關於緩存抽象的預期用途here。簡而言之,如果其中一個應用程序對象調用某個「外部」,「昂貴」的服務來訪問資源,那麼緩存可能適用,特別是如果輸入傳遞的結果每次都是完全相同的輸出時間。
因此,讓我們想象一下,讓我們想象一下,您的應用程序調用Google Maps API中的Geocoding API來轉換地址和(相反的)緯度/經度座標。
你可能有一個應用程序春天@Service
組件是這樣的...
@Service("AddressService")
class MyApplicationAddressService {
@Autowired
private GoogleGeocodingApiDao googleGeocodingApiDao;
@Cacheable("Address")
public Address getAddressFor(Point location) {
return googleGeocodingApiDao.convert(location);
}
}
@Region("Address")
class Address {
private Point location;
private State state;
private String street;
private String city;
private String zipCode;
...
}
顯然,給定一個緯度/經度(輸入),它應該產生相同的地址(結果)每次。此外,由於對Google的地理編碼服務等外部API進行(網絡)調用可能非常昂貴,因此無論是訪問資源還是執行轉換,此類服務調用都是用於在我們的應用程序中緩存的最佳選擇。
在衆多other caching providers(例如的Ehcache,Hazelcaset,Redis的,等等),就可以了,當然,use舉足輕重的GemFire,或開源的替代,阿帕奇的Geode備份春天的緩存抽象。
在你舉足輕重的GemFire/阿帕奇的Geode設置,當然你也可以使用兩peer-to-peer(P2P)或client/server拓撲結構,它並不真正的問題,並的GemFire /的Geode會做正確的事,一旦「呼籲」。
但是,在春Cache Abstraction文檔狀態,當你撥打電話到您的應用程序組件的方法之一(如getAddressFor(:Point)
),支持高速緩存(與@Cacheable
)攔截器將首先製造方法之前「諮詢」緩存呼叫。如果該值存在於緩存中,則返回該值,並且調用「昂貴的」方法調用(例如getAddressFor(:Point)
)將調用而不是。
但是,如果沒有高速緩存未命中,然後春將在調用方法進行,並在從方法調用成功返回,緩存的後盾緩存提供了調用的結果(如的GemFire/Geode),以便下次使用相同的輸入調用方法調用時,將返回緩存的值。
現在,如果您的應用程序正在使用client/sever拓撲結構,那麼當然,客戶端緩存將請求轉發到服務器是否......
相應的客戶端地區是一個代理,或...
相應的客戶端地區是CACHING_PROXY,並在客戶端的本地客戶端地區不包含要求點爲地址。
我鼓勵您閱讀有關不同客戶端區域數據管理政策here的更多信息。
要查看Spring的緩存抽象通過舉足輕重的GemFire行動支持的另一實施,看看...
我在SpringOne上,2015年的談話中使用這個例子作爲高速緩存提供者解釋緩存與GemFire/Geode。這個特定的示例向REST API發出一個外部請求以獲得「每日報價」。
希望這會有所幫助!
乾杯, 約翰
我意識到緩存抽象。我的問題是:如果getAddressFor函數在Gemfire的客戶端/服務器部署模型中的客戶端程序中運行,googleGeocodingApiDao.convert是否會被調用?我相信它不會,因爲如果有緩存未命中,緩存請求將被轉發到服務器。 GoogleGeocodingApiDao永遠不會有機會獲取數據。如果我錯了,請糾正我。 – Yash
無論您是使用客戶端/服務器還是使用p2p,行爲都是相同的。如果輸入已經被緩存,Spring將首先「詢問」緩存提供者(即GemFire)。如果客戶端是「PROXY」(甚至是「CACHING_PROXY」),它將立即將請求轉發給服務器。如果相應的服務器端區域(例如「Address」)不包含條目,則GemFire將返回** null **,並且Spring的Cache抽象將** null **標記爲「緩存未命中」和「繼續「來調用該方法,導致對'googleGeocodingApiDao.convert(:Point)'的調用。該調用的結果... –
...將被緩存,這意味着緩存客戶端(同樣,一個'PROXY')將把值轉發到服務器區域(「地址」)進行存儲。隨後調用'MyApplicationAddressService.getAddressFor(:Point)',給定相同的座標,將導致結果被從GemFire中取出,然後'googleGeocodingApiDao.convert(:Point)'方法將不會**爲調用。 –