ASP.NET кеширование с несколькими индексами - PullRequest
3 голосов
/ 12 сентября 2011

В моем DataCache мне нужно кэшировать объект, используя два индекса.

Скажите, что я кеширую вот так:

Campaign campaign = //get campaign from db

HttpContext.Current.Cache.Add(
"Campaigns.Id."+campaign.Id.ToString(), 
campaign,
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Normal,
null);

HttpContext.Current.Cache.Insert("Campaigns.Code."+campaign.Code,
campaign,
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Normal,
null);

Я пытаюсь получить доступ к кешу, используя Id или Code "index". Если не найдено, кампания извлекается и индексируется, как показано выше.

Может ли этот метод привести к каким-либо проблемам?

ASP может решить удалить только один из индексов. Если я получу доступ к кешу через этот индекс, он снова получит элемент и переиндексирует оба, и это нормально.

UPDATE:

Мой главный вопрос заключается в том, должен ли я платить за хранение объекта два раза или это просто ссылка на тот же объект, который хранится в кэше?

1 Ответ

4 голосов
/ 21 сентября 2011

Вы можете убедиться, что обе записи удаляются вместе, используя объект CacheDependency.Вот обновленный оператор вставки.Это делает время истечения больше не необходимым.

HttpContext.Current.Cache.Insert(
  "Campaigns.Code." + campaign.Code, 
  campaign, 
  new CacheDependency(null, new [] {"Campaigns.Id."+campaign.Id.ToString()}));

Но на практике оба варианта хороши.

Редактировать: Вероятно, вы должны сделать вставку второй записи зависимой от успеха добавленияпервая запись.Рассмотрим сценарий, в котором несколько запросов запрашивают объект, которого нет в кэше.Типичная гонка.Все они создают данные (отлично), один из них может успешно позвонить Add(...) (хорошо), но все они могут успешно позвонить Insert(...) (возможно, плохо).Вы можете получить разные объекты, возвращенные для ваших двух индексов.

Я предлагаю следующие изменения в вашем коде:

Campaign campaign = //get campaign from db
string id = "Campaigns.Id." + campaign.Id.ToString();
object old = HttpContext.Current.Cache.Add(
    id, campaign, null,
    System.Web.Caching.Cache.NoAbsoluteExpiration,
    System.Web.Caching.Cache.NoSlidingExpiration,
    System.Web.Caching.CacheItemPriority.Normal,
    null);
if (old == null) {
    // the object was successfully added
    HttpContext.Current.Cache.Insert(
        "Campaigns.Code." + campaign.Code, 
        campaign, 
        new CacheDependency(null, new [] { id }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...