【问题标题】:How to have permanent cached data in IIS6如何在 IIS6 中拥有永久缓存的数据
【发布时间】:2023-04-11 05:53:02
【问题描述】:

我有一个在 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;
        }

}

【问题讨论】:

  • 你在哪里实例化CacheUsers
  • 所以您希望在应用程序池回收后显示数据?
  • 2.是的,当然,我希望应用池回收后的数据,这就是目的。

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


【解决方案1】:

编辑:物体可以存活多长时间 -

技术上 AppDomain 中的 CLR 对象无法在该 AppDomain 重新启动后幸存(即在 ASP.Net 中,它可能由 web.config 中的更改引起),因此无法幸存AppPool 回收(进程关闭)。 Native 对象也将无法在 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,您甚至可以实现“永久缓存”项目。

【讨论】:

  • 有很多帖子捍卫静态变量vs Caching.Cache
  • 我阅读了 [link]stackoverflow.com/questions/6922763/…,我们可以阅读“而您的 HashTable 中的对象在您的应用程序池处于活动状态时仍然存在(除非您手动删除条目)。”
【解决方案2】:

我已经修改了代码,并使用了 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 指出了这个原因:Removed。但是,谁做的呢?

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    相关资源
    最近更新 更多