|
該示例將使用 AppendLog() 方法(這里不討論該方法,請(qǐng)參閱 Writing Entries to Event Logs)中定義的任何邏輯來(lái)記錄緩存中的數(shù)據(jù)到期的原因。通過在從緩存中刪除項(xiàng)時(shí)記錄這些項(xiàng)并記錄刪除的原因,您可以確定是否在有效地使用緩存或者您是否可能需要增加服務(wù)器上的內(nèi)存。注意,callback 是一個(gè)靜態(tài)(在 VB 中為 Shared)方法,建議使用該方法的原因是,如果不使用它,保存回調(diào)函數(shù)的類的實(shí)例將保留在內(nèi)存中,以支持回調(diào)(對(duì) static/Shared 方法則沒有必要)。
該特性有一個(gè)潛在的用處 — 在后臺(tái)刷新緩存的數(shù)據(jù),這樣用戶永遠(yuǎn)都不必等待數(shù)據(jù)被填充,但數(shù)據(jù)始終保持相對(duì)較新的狀態(tài)。但實(shí)際上,此特性并不適用于當(dāng)前版本的緩存 API,因?yàn)樵趶木彺嬷袆h除緩存的項(xiàng)之前,不觸發(fā)或不完成回調(diào)。因此,用戶將頻繁地發(fā)出嘗試訪問緩存值的請(qǐng)求,然后發(fā)現(xiàn)緩存值為空,不得不等待緩存值的重新填充。我希望在未來(lái)的 ASP.NET 版本中看到一個(gè)附加的回調(diào),可以稱為 CachedItemExpiredButNotRemovedCallback,如果定義了該回調(diào),則必須在刪除緩存項(xiàng)之前完成執(zhí)行。
緩存數(shù)據(jù)引用模式
每當(dāng)我們嘗試訪問緩存中的數(shù)據(jù)時(shí),都應(yīng)該考慮到一種情況,那就是數(shù)據(jù)可能已經(jīng)不在緩存中了。因此,下面的模式應(yīng)該普遍適用于您對(duì)緩存的數(shù)據(jù)的訪問。在這種情況下,我們假定已緩存的數(shù)據(jù)是一個(gè)數(shù)據(jù)表。
|
關(guān)于此模式,有以下幾點(diǎn)需要注意:
1) 某些值(例如,cacheKey、cacheItem 和緩存持續(xù)時(shí)間)是一次定義的,并且只定義一次。
2) 可以根據(jù)需要跳過緩存 — 例如,當(dāng)注冊(cè)一個(gè)新客戶并重定向到客戶列表后,最好的做法可能就是跳過緩存,用最新數(shù)據(jù)重新填充緩存,該數(shù)據(jù)包括新插入的客戶。
3) 緩存只能訪問一次。這種做法可以提高性能,并確保不會(huì)發(fā)生 NullReferenceExceptions,因?yàn)樵擁?xiàng)在第一次被檢查時(shí)是存在的,但第二次檢查之前就已經(jīng)到期了。
4) 該模式使用強(qiáng)類型檢查。C# 中的 "as" 運(yùn)算符嘗試將對(duì)象轉(zhuǎn)換為類型,如果失敗或該對(duì)象為空,則只返回 null(空)。
5) 持續(xù)時(shí)間存儲(chǔ)在配置文件中。在理想的情況下,所有的緩存依賴項(xiàng)(無(wú)論是基于文件的,或是基于時(shí)間的,還是其他類型的依賴項(xiàng))都應(yīng)該存儲(chǔ)在配置文件中,這樣就可以進(jìn)行更改并輕松地測(cè)量性能。我還建議您指定默認(rèn)緩存持續(xù)時(shí)間,而且,如果沒有為所使用的 cacheKey 指定持續(xù)時(shí)間,就讓 GetCacheSecondsFromConfig() 方法使用該默認(rèn)持續(xù)時(shí)間。
相關(guān)的代碼示例是一個(gè) helper 類,它將處理上述所有情況,但允許通過一行或兩行代碼訪問緩存的數(shù)據(jù)。請(qǐng)下載 CacheDemos.msi.
小結(jié)
緩存可以使應(yīng)用程序的性能得到很大的提高,因此在設(shè)計(jì)應(yīng)用程序以及對(duì)應(yīng)用程序進(jìn)行性能測(cè)試時(shí)應(yīng)該予以考慮。應(yīng)用程序總會(huì)或多或少地受益于緩存,當(dāng)然有些應(yīng)用程序比其他應(yīng)用程序更適合使用緩存。對(duì) ASP.NET 提供的緩存選項(xiàng)的深刻理解是任何 ASP.NET 開發(fā)人員應(yīng)該掌握的重要技巧。