過去,我一直在使用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;
}
感謝尼克,所以我添加到我的問題的線條是無稽之談? –
我不確定,在我的項目中,我們使用appfabric速度(不是天藍色)。我們啓用了本地緩存。我們只使用'get',而不是'getifnewer'。我們的get調用總是進入appfabric分佈式緩存集羣,但因爲啓用了本地緩存,所以如果本地緩存已經具有當前版本,則完全緩存鍵值對象不必從集羣中序列化回來。所以,舉個例子,我不會問緩存集羣的具體版本,我只會問是否要求密鑰,並且appfabric客戶端會根據需要從本地緩存中檢索/存儲。 –
我剛看了一下荷蘭的網站。我想我的答案是正確的,他們試圖歸檔的東西稍有不同。通過傳遞版本並調用GetIfNewer,如果版本仍然是最新的,則通過引用傳遞的對象將被保留(以及對其進行的任何本地更改),而如果調用Get,則總是會返回新對象。這取決於你需要什麼。 –