2012-03-08 23 views
0

我在IIS6上運行的C#(FrameWork 4.0)中有一個應用程序。如何在IIS6中擁有永久緩存的數據

我想要緩存的數據數據(類的腳)永久, ,但事件或類似的東西在短時間(15-25分鐘)刪除緩存的數據, 。

我配置IIS僅使用此選項:回收工作進程(以分鐘計)1740

任何想法,以保持高速緩存中的數據? 靜態變量的filetime是否與應用程序生命週期相同?

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

} 
+0

你在哪裏實例'CacheUsers'? – Matthew 2012-03-08 18:13:42

+0

因此,您希望數據在應用程序池回收後出現? – 2012-03-08 18:17:13

+0

2.是的,當然,我希望在應用程序池回收後獲得數據,這是目的。 – 2012-03-09 09:38:27

回答

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,您甚至可以實現「永久緩存」項目。

+0

有很多後防御靜態變量vs Caching.Cache – 2012-03-09 10:05:38

+0

我讀[鏈接] http://stackoverflow.com/questions/6922763/httpruntime-cache-vs-sta--tic-dictionary-fields,我們可以讀「而你的HashTable中的對象是活着的,因爲你的應用程序池是活着的(除非你手動刪除一個條目)。「 – 2012-03-09 10:11:05

0

我已經加密了代碼,並且使用了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指示原因:已刪除。但是,誰做的?