2012-01-21 3 views
3

В прошлые дни я работал с Azure Caching. Хорошей практикой является использование функции локального кеша для предотвращения обращений к распределенному кешу.Лазерный локальный кэш против распределенного кэша

Как можно прочитать в документации; когда вы выполняете вызов dataCache.Get (...), приложение сначала проверяет, доступна ли версия в локальном кеше, а если нет, объект извлекается из распределенного кеша. Проблема в том, что локальная версия может быть старше распределенной версии объекта. Чтобы решить эту проблему, доступен метод 'dataCache.GetIfNewer (...)', который можно использовать для проверки того, отличается ли версия локального объекта от распределенной версии и, если это так, возвращает новый объект.

До сих пор так хорошо ... теперь мои вопросы; Я создал два отдельных приложения (приложение A en app B), чтобы проверить механизм кэширования Azure. Оба приложения работают в двух разных (физических) местоположениях, поэтому оба они имеют свой собственный локальный кеш, но оба они используют один и тот же распределенный кеш.

Верно ли, что что-то изменилось в процессе аннулирования локального кеша? Я проверил следующий сценарий и обнаружил, что локальный кэш обновляется автоматически:

  • App A сохраняет значение «123» в распределенной кэш-памяти с помощью клавиши «CacheTest»
  • App B использует DataCache .Get (...) для извлечения объекта для ключа «CacheTest», который не может быть найден в локальном кеше, поэтому он извлекается из распределенного кеша, возвращает объект со значением «123».
  • Приложение А изменяет объект с помощью ключа «CacheTest» на значение «456»
  • Приложение B использует метод datacache.Get (...) для (снова) получения объекта. Поскольку объект должен находиться в локальном кеше, я бы ожидал значение «123», но он возвращает новое значение «456»!

Как это странно? Что-то изменилось в Azure Caching в последнее время? И да ... Я уверен, что я включил локальное кэширование и да, я установил тайм-аут в локальном кеше на 3600 секунд (1 час).

Может ли кто-нибудь подтвердить, что Azure Caching был изменен?

Редактировать для Ник: Итак, что вы говорите, это то, что следующие строки кода, которые я нашел на голландском сайте Microsoft, нонсенс? Когда локальный кэш обновляются автоматически, нет необходимости вызывать метод «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

Я не уверен, В моем проекте мы используем скорость аппликации (не лазурь). У нас включено локальное кэширование. Мы используем только «get, not» getifnewer.Наши вызовы всегда идут в кластер распределенных кластеров приложений, но поскольку локальное кэширование включено, если локальный кеш уже имеет текущую версию, полный объект ключа кеша не обязательно должен быть сериализован обратно из кластера. Так, например, я бы не стал спрашивать кластер кэша для конкретной версии, я бы просто спросил, будет ли ключ и клиент appfabric искать после получения/сохранения в локальном кеше по мере необходимости. –

+0

Я просто посмотрел на голландский сайт. Я думаю, что мой ответ правильный, то, что они пытаются архивировать, несколько отличается. Передавая версию и вызывая GetIfNewer, если версия по-прежнему актуальна, объект, переданный по ссылке, будет сохранен (и любые локальные изменения внесены в него), тогда как если вы вызовете Get, вы всегда получите новый объект обратно. Это зависит от того, что вам нужно. –

Смежные вопросы