[英]Caching Data in ASP.NET MVC 3
我有一個ASP.NET MVC 3應用程序,基本上只是一組Web服務。 這些Web服務由一組Controller操作公開。 每個控制器操作都會查詢我的數 因為我的數據很少變化,並且陳舊的數據不是一個問題,我想我會實現一些緩存來提高性能。 我的目標是:
那有意義嗎? 我知道如何防止緩存響應。 我只使用以下內容:
HttpContext.Response.Cache.SetCacheability(cacheability)
但是,我不知道如何在內存中緩存我的數據庫記錄長達24小時。 有沒有人對如何做到這一點有任何建議? 我甚至不確定在哪里看。
謝謝
您可以使用System.Runtime.Caching
命名空間(或ASP.NET緩存,但這是較舊的,只能在Web應用程序中使用)。
這是一個示例函數,您可以使用它來包裝當前的數據檢索機制。 您可以更改MemoryCache.Add中的參數來控制緩存的數量,但是您要求24h以上。
using System.Runtime.Caching; // At top of file
public IEnumerable<MyDataObject> GetData()
{
IEnumerable<MyDataObject> data = MemoryCache.Default.Get(MYCACHEKEY) as IEnumerable<MyDataObject>;
if (data == null)
{
data = // actually get your data from the database here
MemoryCache.Default.Add(MYCACHEKEY, data, DateTimeOffset.Now.AddHours(24));
}
return data;
}
正如@Bond所提到的,如果您緩存的數據可能在24小時內發生變化,您可能還希望查看使用SQL緩存依賴關系。 如果它非常靜態,那么這將完成你的要求。
MVC框架是持久性不可知的。 沒有內置的方法來存儲數據,因此沒有內置的方法來緩存存儲的數據。
OutputCache
屬性可用於緩存服務器響應。 但是你明確表示那不是你想要做的事情。
但是,如果要保留在MVC框架內,您仍可以使用內置的OutputCache
。 考慮將要緩存的數據公開為JSON結果
[OutputCache(Duration = 86400)]
public JsonResult GetMyData() {
var results = QueryResults();
return Json(results);
}
/ControllerName/GetMyData
的JSON字符串將被緩存24小時,因此實際查詢每天只會運行一次。 這意味着您必須在最終頁面上實現AJAX調用,或者從服務器進行另一次HTTP調用。 這些都不是理想的。
我會在MVC框架之外尋找你的問題的另一個解決方案。 考慮一下memcached ,它就是為了這個目的而創建的。
你所談論的並不完全是MVC的責任。 ASP.Net只允許你生成它所產生的東西(而且這是他們的回應,顯而易見)。
如果你想緩存數據,最好將它與它生成的相同位置 - 在BL或數據層中的某個地方。
你可以這樣做:
public class DataCacher
{
private static String data;
private static DateTime updateTime;
private DataCacher() { }
public static String Data
{
get
{
if (data == null || updateTime > DateTime.Now)
{
data = "Insert method that requests your data form DB here: GetData()";
updateTime = DateTime.Now.AddDays(1);
}
return data;
}
}
}
String data
數據在此處顯示您的實際數據 添加此類后,用DataCacher.Data
替換GetData()
方法。
希望它有助於或至少引導您進一步思考。
如果您使用的是MSSQL,則可能需要查看SQL Cache Dependency 。
我不確定您是否可以將緩存過期配置為24小時,但是您可能不需要緩存依賴性 - 只要數據庫有更新,它就會使緩存失效(即應該比緩存時間更有效)戰略)。
這是一篇很好的文章,討論了ASP.NET MVC 3的幾個與性能相關的實踐,並提到了緩存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.