Как препятствовать тому, чтобы ASP.NET удалил объекты из кэша

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

9
задан 7 July 2009 в 14:15
поделиться

6 ответов

Мой ответ неверен. Пожалуйста, см. Здесь для правильного ответа.


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

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

Application["myData"] = ...;

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

1
ответ дан 4 December 2019 в 07:35
поделиться

Если вы хотите, чтобы что-то хранилось в памяти постоянно (то есть на время существования AppDomain), тогда статическое поле (в вашем случае Dictionary ) - лучший вариант.

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

1
ответ дан 4 December 2019 в 07:35
поделиться

Используйте 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;
    }
}

удачи

4
ответ дан 4 December 2019 в 07:35
поделиться

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

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

В нем говорится:

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

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

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

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

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

1
ответ дан 4 December 2019 в 07:35
поделиться

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

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

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

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

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

22
ответ дан 4 December 2019 в 07:35
поделиться

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

0
ответ дан 4 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: