Как запретить ASP.NET удалять элементы из кэша

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

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

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

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

Matra

 Muhammad Akhtar07 июл. 2009 г., 16:39
что вы хотите хранить?
 BigBlondeViking07 июл. 2009 г., 18:31
Насколько большой / сложный предмет? или это просто настройки?

Ответы на вопрос(7)

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

этоshould переопределить настройку machine.config.

 16 дек. 2016 г., 22:23
Вы должны дать четкий ответ в разделе ответов, это больше похоже на другой вопрос

ша ASP.NET (то есть объекта HttpContext.Current.Cache), и это очень важно.

Пожалуйста, смотрите раздел в статье MSDNASP.NET Кэширование Обзор называется «Автоматическое удаление данных», которое дает наиболее актуальную информацию относительно элементов, удаляемых из кэша.

Говорится:

ASP.NET can remove data from the cache for one of these reasons:

Because memory on the server is low, a process known as scavenging. Because the item in the cache has expired. Because the item's dependency changes.

To help you manage cached items, ASP.NET can notify your application when items are removed from the cache.

Scavenging is the process of deleting items from the cache when memory is scarce. Items are removed when they have not been accessed in some time or when items are marked as low priority when added to the cache. ASP.NET uses the CacheItemPriority object to determine which items to scavenge first. For more information see How to: Add Items to the Cache.

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

ции в кеш при необходимости. УвидетьВот

ша (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;
    }
}

удачи

Решение Вопроса

посмотреть здесь за правильный ответ.

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

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

Application["myData"] = ...;

Это похоже на коллекцию SessionState, но, как следует из названия, она распространяется на все приложения.

 10 авг. 2011 г., 17:32
Неправильно. См. Ответ user134706 ниже.
 22 июл. 2014 г., 20:12
К сожалению, я не могу удалить свой ответ (возможно, потому что это принятый ответ)

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

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

You can't prevent ASP.NET from removing items from the cache (e.g. when memory gets low).

You cannot ever completely prevent something from being removed from the ASP.NET Cache (i.e. the HttpContext.Current.Cache object) and this is very much by design.

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

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

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

 13 июл. 2009 г., 08:00
Runtime, вы проверяли это? Ответ от BigBlondeViking указывает на то, что подобные предметы могут быть удалены.
 13 июл. 2009 г., 13:42
Матра, да, я проверил это. Путаница возникает из-за возможности вручную удалить элемент с таким приоритетом, а также автоматически удалить его, указав определенный срок действия или зависимость. Итак, NotRemovable НЕ означает, что после того, как вы кешируете его, он ДОЛЖЕН остаться там на всю жизнь приложения. NotRemovable означает, что реализация ms не удалит такой элемент, когда у вас мало памяти. Вот как состояние сеанса inproc хранится в кеше. Если все ваши элементы не могут быть удалены, и вы кэшируете сверх своей памяти, вы получаете OutOfMemory.

Ваш ответ на вопрос