Как иметь постоянные кэшированные данные в IIS6 - PullRequest
0 голосов
/ 08 марта 2012

У меня есть приложение на C # (FrameWork 4.0), работающее на IIS6.

Я бы хотел, чтобы данные кэшировались (класс на ноге) постоянно, но событие или что-то подобное удаляет эти кэшированные данные, в короткие сроки (15-25 минут).

Я настраиваю IIS только с помощью этой опции: перезапуск рабочих процессов (в минутах) 1740.

Есть идеи по сохранению кэшированных данных? Является ли время файла статической переменной таким же, как время жизни приложения?

public class CacheUsers
{
        static object objlock;
        private static List<Users> usersList { get; set; }
        private static DateTime lastUpdate;

        public CacheUsers()
        {
            if (objlock == null)
            {
                objlock = new object();
            }
            lock (objlock)
            {
                if (usersList == null || usersList.Count.Equals(0) || (lastUpdate < DateTime.Now.AddHours(-24)))
                {
                    UpdateUserList();
                }
            }
        }

        public static List<Users> ListaCacheada
        {
            get
            {
                if (usersList == null || usersList.Count.Equals(0) || (lastUpdate < DateTime.Now.AddHours(-24)))
                {
                    UpdateUserList();
                }
                return usersList;
            }
        }

        /// <summary>
        /// Refresh the user list
        /// </summary>
        private static void UpdateUserList()
        {
            usersList = GetUsers();
            lastUpdate = DateTime.Now;
        }

}

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Редактировать: Как долго объекты могут выжить -

Технически невозможно, чтобы объекты CLR в AppDomain не могли пережить перезапуск этого AppDomain (т. Е. В ASP.Net это может быть вызвано изменением в web.config), в результате чего нет способа выжить в AppPool перезапуск (отключение процесса). Нативные объекты также не смогут пережить переработку AppPool.

Перезапуск AppPool не обязателен, чтобы снова создать процесс (на самом деле это не так), только первый запрос к сайту, обслуживаемому этим AppPool, запустит процесс.

Таким образом, если ваша цель строго «мои объекты CLR должны находиться в каком-то кеше сразу после перезапуска AppPool», самым близким было бы повторное кеширование объектов в вашем Application_Start (или эквивалентном методе в модуле). Обратите внимание, что статические объекты не гарантированно создаются во время загрузки сборки, поэтому, если вы хотите использовать статические объекты для кэширования, вам все равно нужно инициировать создание, т. Е. Получить к ним доступ в Application_Start.

Если вам нужно, чтобы объекты жили дольше, чем у AppPool - вам нужен отдельный сервис. Такие системы должны держать объекты вне процесса (а иногда и машины), поэтому вы будете платить за удаленный доступ к таким объектам.

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


Обычное использование "кэширования" - это кэширование объектов, создание которых является дорогостоящим, неясно, чего вы хотите достичь с помощью вашего определения "кэширования".

Это часто делается путем сокрытия логики кэширования внутри метода, который предоставляет объект:

MyObject GetMyObject()
{
  MyObject result= cacheProvider.Get("cacheId_MyObject");
  if (result = null)
  { 
    result = VerySlowMethodToCreateMyObject();
    cacheProvider.Cache("cacheId_MyObject", result);
  }
  return result;
}

Попробуйте просто использовать System.Web.Caching.Cache. Его метод Insert предоставляет множество опций. Вы даже можете реализовать элементы «кэшированные навсегда», если вы предоставите onRemoveCallback.

0 голосов
/ 12 марта 2012

Я изменил код, и я использую HttpRuntime.Cache, и ничего не происходит.: - (

Проблема в том, что пул приложений должен работать только один раз в день, потому что:

Я настраиваю IIS только с помощью этой опции: перезапускать рабочие процессы (в минутах)1740

и, кажется, что-то запускает этот процесс много раз (приблизительно, каждые 15 минут).

Я просто хочу остановить переработчик пула приложений. Кому я могу это сделать?

    public class CacheUsers  
    {          
         static object objlock;          
        private static List<Users> usersList { get; set; }          


    public CacheUsers()          
    {              
        if (objlock == null)              
        {                  
            objlock = new object();              
        }              
        lock (objlock)              
        {                  
            if (usersList == null || usersList.Count.Equals(0))                  
            {                      
                UpdateUserList();                  
            }              
        }          
    } 

    private static void UpdateUserList()          
    {         
                 usersList = GetList(); 
                HttpRuntime.Cache.Insert("Key", usersList , null,
                            Cache.NoAbsoluteExpiration,
                            Cache.NoSlidingExpiration,
                            System.Web.Caching.CacheItemPriority.NotRemovable,
                            ReportRemovedCallback
                            );               
    }    




}  

ReportRemovedCallback указывает причину этого: Удалено. Но кто это делает?

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