2009-11-19 31 views
4

我正在使用ASP.NET的數據緩存API。例如:ASP.NET數據緩存 - 在應用程序域重啓後保留內容

HttpRuntime.Cache.Insert(my_data, my_key); 

有沒有什麼辦法配置緩存,以便在應用程序域回收時保留其內容?

我將很多對象加載到緩存中,但每次應用程序域重新啓動時都會重新加載這些對象。假設這個問題,我無法阻止由於服務器配置而重啓AppDomain。

+0

這方面的進展如何? – Middletone

回答

2

有什麼辦法來配置緩存,這樣,當 應用程序域回收 其內容被保留?

不。Cache對象在RAM中保存引用。期。

替代方案:

  1. 外的進程外會話狀態(雖然這是每個用戶)
  2. 分佈式緩存
  3. 使用SQL Server作爲一個高速緩存(如果它使數據在內存中,而不是在磁盤上)
  4. 在Web層寫的對象盤

我一般喜歡#3本人,雖然有方案其他人都適合。

+0

不能將緩存API配置爲持久存儲到SQL Server,對吧?我需要修改當前的緩存API調用以通過其他API。 – frankadelic

+0

正確。緩存API僅適用於內存中的引用;沒有任何選項可以使條目保持不變。原因是持久性需要以某種形式進行序列化,這很昂貴。實際上,Cache API的常見用途之一是避免序列化和相關開銷。但是,如果您的數據來自SQL Server,那麼您不需要自己再保留它;如果它發生變化,您只需要得到通知,這是SqlDependency的全部內容。 – RickNZ

0

回收應用程序域會轉儲緩存。如果你想解決這個問題,你需要使用分佈式緩存。 Here就是一個例子。

0

對於最昂貴的數據,您可以使用分佈式緩存(如Memcached或速度)來緩存對象。根據對象的大小和運行時間的長短,如果對這些資源的訪問速度低於創建對象的時間,也可以將其序列化到磁盤或數據庫。

現在,由於進程內緩存與任何其他解決方案相比都超快,因爲它只是持有對內存對象的引用,所以您可能希望儘可能使用它。您可以將緩存對象的副本保留在磁盤上,直到它丟失,然後從中重新創建它並將其放置在內存中。這很棘手的是當你必須過期數據,所以只使用緩存/磁盤/ SQL組合,你不需要過期/無效的數據,否則你將需要確保你清除這兩個。例如,這也將避免無法在共享服務器上實現分佈式緩存。

相關問題