ASP.NET的持續文件系統磁盤緩存

摘要:https://www.codeproject.com/articles/12097/cache-management-in-asp-net
使用不同的術語來解釋相同的概念,即管理數據。有些人將其稱為國家管理,另一些人則稱其為緩存管理。我喜歡“緩存”一詞。但是從概念上講,這兩個之間沒有區別。
現在,讓我們討論ASP.NET中緩存管理(或狀態管理)的不同方面。
儘管在Windows應用程序中,緩存管理不是問題,但在Web環境中一直是一個挑戰。由於HTTP是一種無狀態協議,Web服務器在不同請求之間無法識別用戶,因此對於我們在不同請求之間識別特定用戶並存儲數據非常重要,以便可以在不同的請求之間重複使用。 ASP.NET提供了許多用於在客戶端(瀏覽器)和服務器(Web服務器)側存儲數據的功能,但有時我們會與何時使用的數據混淆。在ASP.NET中,我們遇到了會話,應用程序和緩存對象之類的功能,但是對於我們來說,了解它們之間的差異很重要,以便在Web應用程序中有效使用它們。
在本文中,我將介紹ASP.NET中可用的不同緩存管理選項。在Web應用程序中,有時我們需要將數據存儲在服務器端,以避免數據存儲中的昂貴數據檢索操作以及耗時的數據格式格式邏輯以提高應用程序性能,並在跨用戶,應用程序和機器的後續請求中重新使用相同的數據。因此,為了實現這一目標,我們需要將(緩存)數據存儲在服務器端。
緩存有助於我們實現QoS的三個重要方面(服務質量):
ASP.NET提供了一個稱為應用程序對象的對象來存儲所有用戶請求可訪問的數據。該對象的壽命與應用程序相關,並且每次應用程序啟動時都會重新創建。與ASP.NET會話對像不同,所有用戶請求都可以訪問此對象。由於此存儲是在應用程序域空間中創建和維護的,因此不應將其用於網絡農場場景中的數據存儲。此選項對於存儲像應用程序元數據(配置文件數據)之類的數據非常有用,該數據可以在應用程序啟動過程中加載到應用程序對象,並且可以在應用程序的壽命中使用,而無需每次為每個用戶請求重新加載它。但是,如果需要在應用程序運行時進行配置文件的任何更改時,需要將緩存的數據無效,則不應使用此選項,因為它不提供任何功能來過期緩存的數據。因此,在這種情況下,應使用其他選項,例如ASP.NET緩存對象,如下所述。
ASP.NET提供了一個鍵值對對象 - System.Web.Caching名稱空間中可用的緩存對象。它的範圍是應用域,壽命與應用程序相關。與ASP.NET會話對像不同,所有用戶請求都可以訪問此對象。
儘管應用程序和高速緩存對像看起來都相同,但它們之間的關鍵差異是緩存對象提供的添加功能,例如到期策略和依賴關係。這意味著可以根據應用程序代碼設置的一些預定時間限製或更改依賴性實體時,可以根據某些預定的時間限製過期/刪除存儲的數據,而此功能在應用程序對像中不可用。
讓我們討論不同的到期政策和所支持的依賴關係。
依賴關係意味著當依賴實體更改時,可以從緩存中刪除項目。因此,可以在從緩存中刪除的項目定義因關係,取決於依賴。 ASP.NET中支持兩種類型的依賴項。
示例:在我的應用程序中說,我正在使用XML文件存儲錯誤詳細信息(錯誤號碼和錯誤消息映射),該詳細信息用於檢索運行時給定錯誤號的錯誤消息。因此,與其每次需要錯誤消息中讀取磁盤的文件,不如說我決定在應用程序啟動時加載一次,然後將其存儲在ASP.NET緩存中以供進一步使用。因此,如果我需要更改配置文件以添加新的錯誤消息或在應用程序運行時更改某些現有錯誤消息,那麼我的緩存數據將會發生什麼?我需要停止應用程序並重新啟動以反映應用程序中的文件更改嗎?答案是否定的。每當使用文件依賴項選項更改文件時,緩存數據就會無效。
到期政策制定了緩存中的項目如何以及何時到期的策略。
.NET遠程Singleton對象與多個客戶端共享同一實例,因此Singleton對象可用於在不同的客戶端調用之間存儲和共享數據。由於可以在流程和機器之外使用.NET遠程裝飾,因此當我們想緩存數據並在服務器和用戶之間共享它時,此選項非常有用。在這種方法中,我們可以將數據存儲為singleton遠程對象的成員變量,並提供讀取和保存數據的方法。但是,在實施此功能時,我們需要確保垃圾收集器不會破壞用作緩存的遠程對象。為此,我們將不得不將遠程緩存對象的租賃期設置為無限,以使租賃期永遠不會淘汰。我們可以通過覆蓋元帥的初始imifetimeservice方法來做到這一點,然後從該方法中返回null。但是這種方法的唯一問題是性能。正如分析所說,與其他方法相比,這種方法的性能非常差。無論如何,要由應用程序設計人員/開發人員分析不同的選項並使用適合要求的最佳選項。
你們都知道什麼是內存映射的文件。它基本上是要將磁盤上的文件映射到應用程序的過程地址空間中的特定地址範圍。此選項允許不同的過程通過提高應用程序性能來使用相同的數據。由於使用內存映射的文件在.NET開發人員中並不是很受歡迎,因此我個人不會建議這種方法,因為實施此方法涉及很多複雜性,並且.NET Framework不支持此方法。但是,如果有人對使用這種方法非常感興趣,那麼他們將必鬚根據自己的要求開發自己的自定義解決方案。
我們使用靜態變量在全球存儲數據或對象,以便可以在應用程序的生命中訪問它們。同樣,在ASP.NET中,我們可以使用靜態對象進行緩存數據,還可以提供檢索和保存數據到緩存的方法。由於靜態變量存儲在過程區域中,因此性能方面的速度更快。但是,由於在發生靜態變量的情況下,實施到期策略和依賴項非常困難,因此我通常更喜歡ASP.NET緩存對象而不是此選項。另一個問題是自定義靜態緩存對象必須是線程安全,必須仔細實現。
我們還可以使用數據庫來存儲數據並在用戶和計算機上共享數據。當我們想緩存大量數據時,這種方法非常有用。由於性能,使用這種方法來存儲少量數據並不是一個好主意。對於存儲少量數據,我們應該選擇其他ASP.NET中心內的緩存機制。由於需要將數據存儲在數據庫中,因此所有對像都需要序列化,以便易於存儲和檢索。我們還可以使用.NET框架中可用的其他類型的序列化格式。
有時,在我們的應用程序中,在某些頁面中,輸出通常不會在特定時間段內發生變化。例如,在人力資源網站中,員工的薪水細節不會頻繁變化,並且一個月只有一次變化。通常,它僅在每個月的第一天更改。因此,在一個月內,“薪水詳細信息”頁面將為特定員工顯示相同的詳細信息。因此,在這種情況下,最好在服務器中某個地方緩存頁面以避免業務計算處理,調用數據庫和頁面渲染邏輯,每次員工希望看到他的薪水詳細信息時。我認為,是的!這是一個很好的主意。為了實現這一目標,ASP.NET提供了一個功能,可以在特定時間段內存儲頁面輸出。它還提供了存儲頁面片段的功能,該片段稱為頁面片段緩存。
有時,我們可能需要在客戶端緩存數據或頁面以提高應用程序性能。使用此機制減少了服務器上的負載,但是當我們在客戶端緩存數據時,該機制存在一些安全問題。
cookie是一個客戶端存儲,每個請求都發送到服務器,也從服務器回复。由於其尺寸限制,它應用於存儲少量數據。可以為cookie設定到期政策以使一定時間後的項目無效。
ASP.NET ViewState僅在WebForms(而不是MVC)中的一個概念,其中與頁面和控件相關的數據存儲在生成的頁面(客戶端端)中。它保留了對服務器多個請求的值。 ViewState在ASP.NET中的加密隱藏字段內在內部實現。 ViewState不應用於存儲大量數據,因為它將用於每個請求的服務器。
隱藏字段與頁面中的任何其他控件相似,但是此控件的可見狀態始終是錯誤的。像ViewState一樣,我們不應將其用於存儲大量數據。隱藏幀可用於在客戶端緩存數據,但請注意,所有Internet瀏覽器都不支持隱藏幀。
Internet瀏覽器為客戶端的緩存頁面提供了緩存機制。可以使用添加到頁面標頭的有效指令或通過在Web服務器中手動設置該指令來設置此設置。我們應該將此選項用於客戶端的靜態頁面,腳本,CS和圖像。
由JavierCañon製成的。