簡體   English   中英

如何在IIS6中具有永久緩存的數據

[英]How to have permanent cached data in IIS6

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

}

編輯:對象可以生存多長時間-

技術上講 ,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,甚至可以實現“永久緩存”項。

我已經修改了代碼,並且使用HttpRuntime.Cache,但沒有任何反應。 :-(

問題在於,應用程序池每天只能運行一次,因為:

我僅使用以下選項配置IIS:回收工作進程(以分鍾為單位)1740

並且似乎有很多次啟動此過程(大約每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指示此原因:已刪除。 但是,是誰呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM