2016-07-28 84 views
0

https://spring.io/guides/gs/caching-gemfire/的示例顯示,如果存在緩存未命中,我們必須從服務器獲取數據並將其存儲在緩存中。Gemfire彈簧示例

這是Gemfire作爲Gemfire服務器運行的例子,還是Gemfire客戶端?我認爲如果存在緩存未命中,客戶端會自動從服務器獲取數據。如果是這樣的話,會不會有客戶端的緩存未命中?

問候,
佳日

回答

1

首先,我認爲你缺少核心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拓撲結構,那麼當然,客戶端緩存將請求轉發到服務器是否......

  1. 相應的客戶端地區是一個代理,或...

  2. 相應的客戶端地區是CACHING_PROXY,並在客戶端的本地客戶端地區不包含要求地址

我鼓勵您閱讀有關不同客戶端區域數據管理政策here的更多信息。

要查看Spring的緩存抽象通過舉足輕重的GemFire行動支持的另一實施,看看...

caching-example

我在SpringOne上,2015年的談話中使用這個例子作爲高速緩存提供者解釋緩存與GemFire/Geode。這個特定的示例向REST API發出一個外部請求以獲得「每日報價」。

希望這會有所幫助!

乾杯, 約翰

+0

我意識到緩存抽象。我的問題是:如果getAddressFor函數在Gemfire的客戶端/服務器部署模型中的客戶端程序中運行,googleGeocodingApiDao.convert是否會被調用?我相信它不會,因爲如果有緩存未命中,緩存請求將被轉發到服務器。 GoogleGeocodingApiDao永遠不會有機會獲取數據。如果我錯了,請糾正我。 – Yash

+0

無論您是使用客戶端/服務器還是使用p2p,行爲都是相同的。如果輸入已經被緩存,Spring將首先「詢問」緩存提供者(即GemFire)。如果客戶端是「PROXY」(甚至是「CACHING_PROXY」),它將立即將請求轉發給服務器。如果相應的服務器端區域(例如「Address」)不包含條目,則GemFire將返回** null **,並且Spring的Cache抽象將** null **標記爲「緩存未命中」和「繼續「來調用該方法,導致對'googleGeocodingApiDao.convert(:Point)'的調用。該調用的結果... –

+0

...將被緩存,這意味着緩存客戶端(同樣,一個'PROXY')將把值轉發到服務器區域(「地址」)進行存儲。隨後調用'MyApplicationAddressService.getAddressFor(:Point)',給定相同的座標,將導致結果被從GemFire中取出,然後'googleGeocodingApiDao.convert(:Point)'方法將不會**爲調用。 –