2012-01-21 54 views
3

過去,我一直在使用Azure緩存。好的做法是使用本地緩存功能來防止往返分佈式緩存。Azure本地緩存與分佈式緩存

可以在文檔中閱讀;當您調用dataCache.Get(...)時,應用程序首先檢查本地緩存中的版本是否可用,如果沒有,則從分佈式緩存中檢索對象。 問題是本地版本可能比對象的分佈式版本舊。爲了解決這個問題,可以使用'dataCache.GetIfNewer(...)'方法來檢查本地對象的版本是否與分佈式版本不同,如果是,它會返回新的對象。

到目前爲止,這麼好......現在我的問題;我創建了兩個獨立的應用程序(應用程序A en應用程序B)來測試Azure緩存機制。兩個應用程序都運行在兩個不同的(物理)位置,因此它們都有自己的本地緩存,但它們都使用相同的分佈式緩存。

確實在失效本地緩存的過程中發生了某些變化?我測試過以下情形,結果發現,本地緩存爲自動更新:

  • 應用程序A存儲值「123」中使用的關鍵「CacheTest」
  • 應用B使用數據高速緩存的分佈式緩存.Get(...)方法檢索無法在本地緩存中找到的密鑰「CacheTest」的對象,以便從分佈式緩存中檢索它,並返回值爲「123」的對象。
  • 應用程序A使用鍵「CacheTest」將對象更改爲值「456」
  • 應用程序B使用datacache.Get(...)方法(再次)檢索對象。因爲對象應該在本地緩存中,所以我期望值「123」,但它返回新值「456」!

這有多奇怪?最近Azure緩存中的內容有所變化嗎?是的...我確定我已經打開了本地緩存,是的,我已經將本地緩存超時設置爲3600秒(1小時)。

有人可以確認Azure緩存已更改嗎?

編輯爲尼克: 所以你說的是,我發現在荷蘭微軟網站上的代碼的下一行是廢話?當本地緩存自動更新,就沒有必要調用「GetIfNewer」的方法:http://www.dotnetmag.nl/Artikel/1478/Windows-Azure-AppFabric-Caching

/// 
/// Ensures that the newest version of a cached object is returned 
/// from either the local cache or the distrbuted cache. 
/// 
public TCachedObjectType GetNewest<TCachedObjectType>(string key) : 
    where TCachedObjectType : class 
{ 
DataCacheItemVersion version; 

// Gets cached object from local cache if it exists. 
// Otherwise gets cached object from distributed cache and 
// adds it to local cache. 
object cachedObject = cache.Get(key, out version); 

// Gets cached object from distributed cached if it is newer 
// than given version. 
// If newer it adds it to local cache. 
object possiblyNewerCachedObject = 
    cache.GetIfNewer(key, ref version); 

if (possiblyNewerCachedObject != null) 
{ 
    // Cached object from distributed cache is newer 
    // than cached object from local cache. 
    cachedObject = possiblyNewerCachedObject; 
} 

return cachedObject as TCachedObjectType; 
} 

回答

1

如果描述的行爲是一樣的AppFabric的速度,所描述的行爲是按預期。啓用本地緩存時,這意味着當給定節點從分佈式緩存請求緩存項時,它會向分佈式緩存請求當前版本。 如果本地緩存版本與分佈式版本匹配,它將從本地緩存中返回數據。如果不是,它從分佈式緩存中檢索最新值,將其緩存在本地,然後將其返回。 這個想法是,如果任何節點更新密鑰,那麼即使appfabric已經在本地緩存了它們,也將始終確保所有節點都能獲得最新版本。分佈式緩存跟蹤最新版本和數據存儲位置。

+0

感謝尼克,所以我添加到我的問題的線條是無稽之談? –

+0

我不確定,在我的項目中,我們使用appfabric速度(不是天藍色)。我們啓用了本地緩存。我們只使用'get',而不是'getifnewer'。我們的get調用總是進入appfabric分佈式緩存集羣,但因爲啓用了本地緩存,所以如果本地緩存已經具有當前版本,則完全緩存鍵值對象不必從集羣中序列化回來。所以,舉個例子,我不會問緩存集羣的具體版本,我只會問是否要求密鑰,並且appfabric客戶端會根據需要從本地緩存中檢索/存儲。 –

+0

我剛看了一下荷蘭的網站。我想我的答案是正確的,他們試圖歸檔的東西稍有不同。通過傳遞版本並調用GetIfNewer,如果版本仍然是最新的,則通過引用傳遞的對象將被保留(以及對其進行的任何本地更改),而如果調用Get,則總是會返回新對象。這取決於你需要什麼。 –