簡體   English   中英

ASP.NET緩存策略

[英]ASP.NET caching strategy

我正在為常用的數據庫對象實現數據緩存,我在確定緩存以下場景的最佳策略時遇到了一些困難:

我有一張名為Campaigns的表,有1423條記錄。 廣告系列包含描述目標網頁的所有文本和設置。 生成登錄頁面時,將從數據庫中提取相應的Campaign。 有些登陸頁面比其他登陸頁面更受歡迎。

(輸出緩存是我的下一步,因此無需對此進行評論。)

我正在大聲思考:

A)在服務器啟動時將所有活動預先加載到Dictionary中並將其放入緩存中。

我已經計算出這將花費大約3.8 MB的服務器內存(OK),並且在首頁視圖上花費大約8秒鍾(OK),並且當前的廣告系列數量。 唯一的問題是這不能很好地擴展。 明天我可能會有10倍的廣告系列。 此外,我們還需要每天更新和添加新廣告系列,並且每次都刪除整個廣告系列緩存似乎有點矯枉過正。

其中很好的部分是所有廣告系列都是緩存的,因此在訪問未訪問的目標網頁時(例如搜索引擎)沒有啟動時間。

B)延遲加載:使用“廣告系列。[id]”等密鑰單獨緩存每個廣告系列。

這樣可以很容易地殺死或添加各種活動,並且我可以使用Sliding功能(如SlidingExpiration)來減少使用較少的廣告系列。 唯一的問題是,當搜索引擎訪問一個很少訪問的頁面時,就是加載廣告系列的時候。 另一個問題是Cache充滿了大量的密鑰。

C)懶惰加載到字典中與B)相同的bennefins,並且緩存不會被大量的鍵混亂,但不能使用緩存功能,如果內存緊張,整個字典將被轉儲。

你怎么看? 我傾向於B)。

此外,我還有一個場景,我需要通過id或代碼(字符串)獲取Campaigns。

在下面的:

Campaigns campaign = //Get campaign from database:
Cache["Campaigns.Id."+campaign.Id.ToString()] = campaign; //Id is Guid
Cache["Campaigns.Code."+campaigns.Code] = campaign;

這會花費我兩倍的內存或僅用於另一個索引參考嗎?

嗯,在我的頭頂,我會看看緩存分組項目(類似於你的B想法),但是對它們進行超時。 這意味着很少使用的項目將緩存,但最終會刷新。 超時應與正常使用頻率相關。 例如,如果正常的廣告系列每小時被點擊10次,則可能會超時,5-10分鍾。

ASP.NET Cache內置了這個超時內容:

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/caching/data.aspx

內存很便宜,但仍需要維護。 作為首次實現,我認為基本的超時設置並不是一個糟糕的開始。 這將需要監視,如任何緩存實現,以查看它是否有助於或阻礙您的使用模式。

我不會像每個項目一樣精確地延遲加載。 用法應該顯示常用項目,或者您可以選擇批次(前10名,前20名等)。 智能地選擇通常訪問的項目組和通常不常見的項目將有助於改善緩存的健康狀況(不是很多過時的項目,沒有太多的流失等)。

至於整體內存使用情況,我認為ASP.NET Cache可以配置為限制采用的字節數:

http://msdn.microsoft.com/en-us/library/ms228248.aspx

所以你不必太擔心這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM