天天看點

雲計算設計模式(一)——緩存預留模式雲計算設計模式(一)——緩存預留模式 根據需求從資料存儲緩存加載資料。這種模式可以提高性能,并有助于維持在基礎資料存儲在高速緩存中保持的資料和資料之間的一緻性。

應用程式使用的高速緩存來優化重複通路的資料存儲中保持的資訊。然而,它通常是不切實際的期望緩存的資料将始終與在資料存儲器中的資料完全一緻。應用程式要實作一種政策,有助于確定在高速緩存中的資料是最新的,隻要有可能,但也可以檢測和處理的過程中出現,當在高速緩存中的資料已經變得陳舊的情況。

許多商業緩存系統提供通讀和直寫式/後寫操作。在這些系統中,應用程式通過引用高速緩存中檢索資料。如果資料不在緩存中,它被透明地從資料存儲中檢索并添加到高速緩存。任何修改在高速緩存中保持的資料被自動地寫入到資料存儲區以及。

為緩存不提供此功能,則使用該緩存保持在高速緩存中的資料的應用程式的責任。

一個應用程式可以通過實作高速緩存預留戰略模拟的讀式高速緩存的功能。這種政策有效地将資料加載需求的高速緩存。圖1總結了在該過程中的步驟。

雲計算設計模式(一)——緩存預留模式雲計算設計模式(一)——緩存預留模式 根據需求從資料存儲緩存加載資料。這種模式可以提高性能,并有助于維持在基礎資料存儲在高速緩存中保持的資料和資料之間的一緻性。

圖1  - 使用Cache-除了圖案來将資料存儲在高速緩沖存儲器

如果一個應用程式将更新的資訊,它可以模拟通寫政策如下:

1.根據修改到資料存儲

2.廢棄對應的項在緩存中。

當該項目被下一個需要,可使用高速緩存預留政策将導緻從資料存儲中檢索和重新添加到高速緩存中的更新資料。

在決定如何實作這個模式時,請考慮以下幾點:

•緩存資料的生命周期。很多緩存實作一個過期政策,導緻資料無效,并從緩存中移除如果它不是在指定時間内通路。對于緩存一邊是有效的,確定了過期政策相比對的通路用于使用資料的應用程式的模式。不要使有效期限太短,因為這會導緻應用程式不斷地從資料存儲中檢索資料,并将其添加到緩存中。同樣,不要使保存期限這麼久,緩存的資料很可能會變得陳舊。記住,緩存是最有效的相對靜态的資料,或者資料被頻繁地讀出。

•驅逐資料。最高速緩存具有比從其中資料源自資料存儲區隻有有限的大小,并在必要時它們将收回的資料。大多數緩存采用最近最少使用的政策選擇項目驅逐,但是這可能是定制的。配置全局到期屬性和高速緩存的其它性能,并且每個高速緩存項的到期屬性,以幫助確定緩存成本效益。它可能并不總是适合于高速緩存中的應用全球驅逐政策,每一個項目。例如,如果緩存項是非常昂貴的,從資料存儲中檢索,也可能是有益的,保留在更頻繁地通路但不昂貴的物品的費用此産品的高速緩存中。

•灌注緩存。許多解決方案,預填充用的應用程式可能需要作為啟動處理的一部分的資料的高速緩存。如果某些資料已到期,被驅逐的緩存,除了圖案可能仍然是有用的。

•一緻性。執行緩存除了圖案不保證資料存儲和高速緩存之間的一緻性。在資料存儲中的項目可以在任何時候被改變由外部的過程中,這種變化可能不反映在高速緩存中的項目被裝載到高速緩存,直到下一次。在一個系統,整個資料存儲複制資料,如果同步發生非常頻繁這個問題可能會變得尤為突出。

•本地(記憶體)緩存。緩存可以是本地的應用程式執行個體,并存儲在記憶體中。緩存預留如果應用程式多次通路相同的資料可以在該環境中是有用的。然而,本地高速緩存是私有的,是以不同的應用程式執行個體可各自具有相同的緩存資料的副本。此資料可能很快變成高速緩存之間不一緻,是以它可能有必要在到期專用高速緩存中儲存的資料和更經常地重新整理。在這些場景中它可能是适當的,調查使用了共享或分布式緩存機制。

使用這種模式時:

•緩存不提供原生讀通過,并通過寫操作。

•資源的需求是不可預測的。這種模式使應用程式能夠按需加載資料。它使任何假設有關的資料的應用程式将需要提前。

這種模式可能不适合:

•當緩存的資料集是靜态的。如果資料将适合可用的高速緩存空間,首要的高速緩存中的資料在啟動和應用,防止資料從止政策。

•對于托管在Web場中的Web應用程式緩存會話狀态資訊。在這種環境下,你應該避免引入基于用戶端 -

伺服器關系的依賴。

在微軟的Azure,您可以使用Azure的緩存來建立一個分布式緩存,可以通過一個應用程式的多個執行個體可以共享。下面的代碼示例中的GetMyEntityAsync方法給出了基于Azure的緩存Cache後備模式的實作。此方法從利用讀雖然方法緩存中的對象。

一個目的是确定用一個整數ID作為鍵。該GetMyEntityAsync方法生成基于此鍵(在Azure緩存API使用的鍵值字元串)的字元串值,并嘗試檢索與從緩存中這一關鍵的項目。如果比對的項目被發現,它被傳回。如果在緩存中沒有比對,則GetMyEntityAsync方法從一個資料存儲中的對象時,把它添加到緩存中,然後将其傳回(即實際上獲得從資料存儲中的資料的代碼已經被省略,因為它是資料存儲依賴)。注意,緩存項被配置以防止其成為陳舊如果是在别處更新過期。

注意:

該示例使用了Azure的緩存API來通路存儲和檢索的緩存資訊。有關Azure的緩存API的更多資訊,請參閱MSDN上使用微軟的Azure緩存。

下面所示的UpdateEntityAsync方法說明如何在高速緩存中的對象無效,當該值是由應用程式改變。這是一個寫通方法的執行個體。該代碼更新原始資料存儲,然後通過調用Remove方法,指定鍵(這部分功能的代碼已經被省略了,因為這将是資料存儲相關)從緩存中删除緩存項。

在這個序列中的步驟的次序是重要的。如果之前的緩存更新的項被删除,對于用戶端應用程式中的資料存儲中的項目之前擷取的資料(因為它沒有在高速緩存中發現的)的機會已經改變一個小視窗,進而在緩存包含過期資料。

繼續閱讀