ASP.NET кешировать объекты для чтения и записи - PullRequest
4 голосов
/ 23 января 2009

что происходит, если пользователь пытается прочитать HttpContext.Current.Cache [ключ] , а другой пытается удалить объект HttpContext.Current.Cache.Remove (ключ) в в то же время?

Подумайте только о сотнях пользователей, читающих из кэша и пытающихся одновременно очистить некоторые объекты кэша. Что происходит и является ли это потокобезопасным?

Можно ли создавать в кэше бизнес-объекты с учетом базы данных?

Ответы [ 3 ]

3 голосов
/ 23 января 2009

Встроенный объект ASP.Net Cache (http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx) является поточно-ориентированным, поэтому операции вставки / удаления в многопоточных средах по своей природе безопасны.

Ваше основное требование для помещения любого объекта в кеш - это возможность сериализации. Так что да, ваш бизнес-объект с поддержкой db может помещаться в кеш.

1 голос
/ 23 января 2009

Если код не может получить объект, то ничего / нуль не возвращается.

Зачем вам пытаться кэшировать объект, если у вас будет возможность удалять его так часто? Лучше установить время истечения и перезагрузить объект, если его больше нет в кэше.

Можете ли вы объяснить "объект, осведомленный о БД"? Вы имеете в виду sql зависимость кэша или просто объект, который имеет информацию о соединении БД?

EDIT: Ответ на комментарий № 3.

Я думаю, что нам здесь чего-то не хватает. Позвольте мне объяснить, что я имею в виду, и вы можете сказать мне, если это правильно.

  1. Пользователь A проверяет наличие объекта в кеше ("resultA") и не находит его.
  2. Пользователь A запускает запрос. Результаты кэшируется как "resultA" в течение 5 минут.
  3. Пользователь B проверяет объект в кеше ("resultA") и находит его.
  4. Пользователь B использует кэшированный объект "resultA"

Если это так, то вам не нужна зависимость Sql Cache.

0 голосов
/ 24 января 2009

Ну, у меня есть код для заполнения кэша:

string cacheKey = GetCacheKey(filter, sort);
if (HttpContext.Current.Cache[cacheKey] == null)
{
  reader = base.ExecuteReader(SelectQuery);
  HttpContext.Current.Cache[cacheKey] = 
    base.GetListByFilter(reader, filter, sort);
}
return HttpContext.Current.Cache[cacheKey] as List<CurrencyDepot>;

и когда таблица обновляет код очистки, выполняемый ниже:

private void CleanCache()
{
  IDictionaryEnumerator enumerator = 
    HttpContext.Current.Cache.GetEnumerator();
  while (enumerator.MoveNext())
  {
    if (enumerator.Key.ToString().Contains(_TableName))
    {
      try {
        HttpContext.Current.Cache.Remove(enumerator.Key.ToString());
      } catch (Exception) {}
    }
  }
}

Это использование вызывает проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...