如何在IIS6中拥有永久缓存数据

时间:2012-03-08 18:07:28

标签: c# asp.net caching static iis-6

我在IIS6上运行C#(FrameWork 4.0)中的应用程序。

我想永久缓存数据数据(徒步) 但是事件或类似事件会删除此缓存数据, 在短时间内(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 个答案:

答案 0 :(得分:1)

编辑:对象可以存活多久 -

技术上 AppDomain中的CLR对象无法在重新启动该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,您甚至可以实现“永久缓存”项目。

答案 1 :(得分:0)

我已经查了代码,我使用了HttpRuntime.Cache,没有任何反应。 : - (

问题是App Pool每天只能运行一次,因为:

  

我只使用此选项配置IIS:回收工作进程(以分钟为单位)1740

似乎有些事情正在推出这个过程很多次(aprox,每15分钟一次)。

我只是想停止App Pool回收站。我可以做什么?

    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指示原因:已删除。但是,谁做到了?