報道公司事件 · 傳播行業動態
例如,當您緩存數據庫中所有流派的查詢結果并使用這一數據而沒有從數據庫中獲取新數據時,可能就不會注意到其他用戶已同時在表中插入了新流派。
緩存的另一問題是不能依賴于緩存中的項。為了使應用程序最小化內存消耗,ASP.NET中的緩存機制不時地自動從緩存中刪除舊的或是不常使用的數據。因此,不能依賴于其中的項,即使你是在應用程序啟動時插入它們的。
下面將介紹如何避免這兩個問題。
1. 避免舊數據
為了避免出現與數據庫的原始數據不再同步的舊數據,需要一種方法來使緩存無效。通過使緩存無效,可將數據項從緩存中刪除,然后可針對下一請求重新創建。使緩存數據無效的方法有很多。首先,可選擇設置一個短暫的緩存持續時間。例如,緩存數據庫中的Genres列表10分鐘。如果別的用戶在這10分鐘期間插入新的流派,它將不在Web頁面上顯示。不過,10分鐘后,該列表從緩存中刪除,在下一次被請求時用新的數據重新創建。后面將介紹如何使用基于時間的緩存。
使緩存無效的另一種選擇是使用緩存依賴性。通過緩存依賴性,可以在緩存的項與原始數據源之間創建關系。在底層數據源改變時,緩存的項無效,這樣在它下次被請求時可重新創建。例如,您可以緩存較大文本或XML文件的內容。可將它插入到緩存中,而不是每次需要時都讀取它。然后,將它與一個CacheDependency實例(它將監視源文件)相掛鉤。一旦該文件發生改變,就從緩存中刪除項,并在下次請求時重新創建。本章最后將介紹如何使用CacheDependency。
在使用像Microsoft SQL Server這樣的數據庫時也可以使用緩存依賴性。這意味著,一旦緩存查詢的一部分數據改變,緩存項就失效。數據庫緩存機制和失效是較寬泛的高級主題。Scott Hanselman在《ASP.NET 3.5高級編程(第5版)(已由清華大學出版社引進并出版,ISBN 978-7-302-18119-4)一書的有關緩存的章節中談到了此內容。
2. 不要依賴緩存中的數據
正如剛看到的,數據項可能會在應用程序的生命周期的不同階段從緩存中刪除。它們會被緩存刪除,是因為ASP.NET運行庫確定它們不經常使用,無謂地占用寶貴空間。當Web應用程序或Web服務器重啟時,會清除整個緩存。數據項也會因為它們的依賴性而被刪除。因此,不要依賴于存儲在緩存中的項,即使在應用程序生命周期的初期放入了這些數據。
本章的后面將介紹如何通過Cache API(Application Programming Interface,應用編程接口;可與Cache功能交互的方法)以編程形式使用緩存,不過這里有一個從緩存中檢索Review實例的快速示例。該代碼沒有假定其中有數據項,而是首先檢查緩存:
VB.NET
Dim reviewId As Integer = Convert.ToInt32(Request.QueryString.Get
("ReviewId"))
Dim myReview As Review
If Cache("MyReview" + reviewId.ToString()) Is Nothing Then
Using db As New PlanetWroxDataContext()
myReview = (From r In db.Reviews _
Where r.Id = reviewId _
choose r).Single()
End Using
Cache("MyReview" + reviewId.ToString()) = myReview
End If
myReview = CType(Cache("MyReview" + reviewId.ToString()), Review)
C#
int reviewId = Convert.ToInt32(Request.QueryString.Get("ReviewId"));
Review myReview;
if (Cache["MyReview" + reviewId.ToString()] == null)
{
using (PlanetWroxDataContext db = new PlanetWroxDataContext())
{
myReview = (from r in db.Reviews
where r.Id == reviewId
choose r).Single();
}
Cache["MyReview" + reviewId.ToString()] = myReview;
}
myReview = (Review) Cache["MyReview" + reviewId.ToString()];
在這個代碼段中,通過鍵(這是靜態文字MyReview和被搜索的Review的ID的組合)在緩存中搜索數據項。如果緩存是空的(搜索返回Nothing或null),就使用LINQ查詢創建數據項,然后存儲在緩存中。
這是個很好的不依賴緩存中的項的示例代碼。它檢查緩存,如果其中不存在數據項就先進行創建。本章后面將介紹更多的有關以編程方式訪問緩存的內容。
使用緩存API并不是使用緩存的唯一方法。下一節將介紹在ASP.NET中緩存數據的不同方法。