2009-07-07 3 views
9

Я хочу постоянно добавлять элемент в кеш. Я использую следующий синтаксис:Как предотвратить удаление ASP.NET элементов из кеша

HttpContext.Current.Cache.Insert(cacheName, c, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration); 

Я выяснил, что ASP.NET по-прежнему иногда удаляет элементы из кеша.

Любые идеи о том, как предотвратить это (в дополнение к сбросив кеш и использование словаря хранится в статическом элементе?

Matra

+0

Что вы хотите сохранить? –

+0

Насколько велика/сложна вещь? или это просто настройки? – BigBlondeViking

ответ

1

Неверный ответ. Пожалуйста, see here за правильный ответ.


Вы не можете предотвратить удаление ASP.NET элементов из кеша (например, когда память становится низкой).

Если вам нужно хранить данные в течение всего жизненного цикла приложения, а затем поместить его в коллекцию ApplicationState, например:

Application["myData"] = ...; 

Это похоже на сбор SessionState, но, как говорит название, это применение в масштабах.

+2

Неверно. См. Ответ пользователя134706 ниже. –

+0

К сожалению, я не могу удалить свой ответ (возможно, потому, что это принятый ответ) – M4N

1

Если вы хотите что-то хранится в памяти постоянно (то есть для жизни AppDomain), то статическое поле (в вашем случае, Dictionary<TKey,TValue>) является лучшим выбором.

После CLR загрузила, содержащий тип в память вашего Dictionary будет храниться в памяти до тех пор, AppDomain не выгружает.

1

Вы никогда не сможете полностью предотвратить удаление какого-либо из кэша ASP.NET (т. Е. Объекта HttpContext.Current.Cache), и это очень по дизайну.

См. Раздел в статье MSDN ASP.NET Caching Overview под названием «Автоматическое удаление данных», в котором содержится наиболее актуальная информация об элементах, удаляемых из кеша.

Она гласит:

ASP.NET может удалить данные из кэша для одной из следующих причин:

  • Поскольку память на сервере низка, процесс, известный как продувка.
  • Поскольку элемент в кеше истек.
  • Потому что зависимость элемента изменяется.

Чтобы управлять кэшированными элементами, ASP.NET может уведомлять ваше приложение, когда элементы удаляются из кеша.

Очистка - это процесс удаления элементов из кеша, когда памяти мало. Элементы удаляются, когда они не были доступны через какое-то время или когда элементы добавлены в кэш. ASP.NET использует объект CacheItemPriority, чтобы определить, какие элементы нужно сначала очистить. Дополнительные сведения см. В разделе Как добавить элементы в кэш.

Именно по этой причине (откачкой если нет другого), что вы никогда не можете быть абсолютно полагаться на элемент, который вы, возможно, ранее размещенных в кэше и явно пометили его NoSlidingExpiration и NoAbsoluteExpiration, и, возможно, даже отмечен как элемент с высоким приоритетом, который все еще находится в кэше в более поздний момент времени.

0

Вы должны быть готовы к обработке пропусков кэш-памяти и перезагрузке информации в кеше по мере необходимости. См. here

4

Используйте Cache.Add() и установите приоритет кеша чрезвычайно высоким (CacheItemPriority.NotRemovable), это поможет ему оставаться в кеше.

HttpContext.Current.Cache.Add("key", "your object", null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null); 

System.Web.Caching.CacheItemPriority.NotRemovable

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

public static string GetSpecialObject 
{ 
    get 
    { 
     object obj = HttpContext.Current.Cache["key"]; 
     if (obj == null) 
     { 
      obj = HttpContext.Current.Cache.Add("key", 
              "I stay in cache as best i can object", // Build Object Function Here 
              null, 
              Cache.NoAbsoluteExpiration, 
              Cache.NoSlidingExpiration, 
              CacheItemPriority.NotRemovable, 
              null); 
     } 
     return (string)obj; 
    } 
} 

удача

21

Вы не можете запретить ASP.NET удалять элементы из кеша (например, когда память становится низкой).

Вы никогда не сможете полностью предотвратить удаление какого-либо объекта из кэша ASP.NET (т. Е. Объекта HttpContext.Current.Cache), и это очень по дизайну.

Неверно! Вы можете запретить удаление ваших предметов из кеша asp.net, если вы помечаете элемент CacheItemPriority.NotRemovable. Все эти кэшированные данные (приложение, сеанс и т. Д.) Хранятся в кэше HttpRuntime таким образом.

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

Итак, если вы никогда не вручную удаляете его и никогда не указываете зависимости, которые могут быть удалены, у вас есть свой предмет в жизни приложения.

+0

Runtime, вы протестировали его? Ответ BigBlondeViking указывает, что этот вид предметов может быть удален. – 2009-07-13 06:00:05

+0

Матра, да, я ее протестировал.Путаница связана с возможностью вручную удалить элемент с таким приоритетом, а также автоматически удалить его, указав некоторое время истечения срока действия или некоторую зависимость. Таким образом, NotRemovable НЕ означает, что когда вы кешируете его, он должен оставаться там для жизни appdomain. NotRemovable означает, что реализация ms не удалит такой элемент, когда вы получите низкий объем памяти. Таким образом, состояние сеанса inproc хранится в кеше. Если все ваши объекты NotRemovable и вы кешируете мимо вашей памяти, вы получите OutOfMemory. – user134706

0

Попробуйте совместить вариант CacheItemPriority.NotRemovable с:

<system.web> 
    <caching> 
     <cache disableExpiration="true"/> 
    </caching> 
    .... 
</system.web> 

Этот должен переопределить настройки machine.config.

+0

Вы должны дать ясный ответ в разделе ответа, это больше похоже на другой вопрос –

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