2008-09-26 54 views
3

我有一個很好的小類構建,充當緩存。每個項目都有一個到期TimeSpan或DateTime。每次嘗試訪問緩存中的項目時,都會檢查項目的過期時間,如果過期,則將項目從緩存中移除並且不返回任何內容。如何從緩存中清除過期的項目?

這對於經常訪問的對象來說很不錯,但是如果一個項目被放入緩存並且再也不會被訪問,即使它已經過期,它也不會被刪除。

什麼是從緩存中過期這些項目的好方法?

我應該有一個後臺線程無限枚舉緩存中的每個項目來檢查它是否過期?

+0

這是一個固定大小的緩存嗎?如果是這樣,我發現沒有問題在緩存中留下項目。 – 2008-09-26 19:36:46

回答

1

根據我的經驗,維護自定義緩存機制變得比它的價值更麻煩。有幾個圖書館已經解決了這些問題。我會建議使用其中之一。 .Net中流行的一個是企業圖書館,儘管我對緩存能力的經驗有限。

如果您必須使用自定義緩存機制,那麼我認爲您提出的監視線程概念沒有問題。也就是說,如果您的應用程序是基於服務器的應用程序而不是Web應用程序。如果它是一個網絡應用程序,您已經建立了滑動到期。然後,您可以將其封裝在強類型封裝中,以避免每次按鍵都引用緩存項。

1

你可以實現一個LRU(最近最少使用)策略,讓您的項目按訪問時間排序,當一個新的項目插入到高速緩存緩存滿你驅逐是去年在該列表中的項目。請參閱維基百科的Cache algorithms

如果您想立即過期,我仍然只會在訪問內容時執行此操作。即當訪問緩存對象並且時間到期時重新提取它。

1

您也可以對緩存進行任何更改(重新啓動),並將間隔設置爲最接近的到期時間戳。這不會精確到毫秒,並且依賴於消息泵運行,但不是非常耗費資源。

雖然Harald Scheirich的回答比較好,但如果您不介意物件永遠懸掛在高速緩存未更新時。

1

在最後一次項目被清除1分鐘後,您可以在第一次訪問時清除適當的舊項目。

private DateTime nextFlush; 
public object getItem(object key) 
{ 
    DateTime now = DateTime.Now 
    if (now > nextFlush) 
    { 
    Flush(); 
    nextFlush = now.AddMinutes(1) 
    } 
    return fetchItem(key); 
} 
5

最好的代碼是沒有代碼的。改爲使用ASP.NET緩存。您可以在任何應用程序中將其引用爲System.Web.HttpRuntime.Cache,而不僅僅是Web應用程序。

+0

如果程序集在兩個不同的地方使用HttpRuntime.Cache會怎麼樣?他們共享相同的緩存,對吧?在這種情況下,不幸的是,這不起作用。它已被使用,因此我不能保證我的物品不會被刪除。 – core 2008-10-03 00:35:56