C# 在ASP.NET MVC 3中缓存数据
我有一个ASP.NET MVC 3应用程序,它基本上只是一组web服务。这些web服务由一组控制器操作公开。每个控制器操作都查询我的数据库。因为我的数据很少更改,而且不需要担心过时的数据,所以我想我应该实现一些缓存来提高性能。我的目标是:C# 在ASP.NET MVC 3中缓存数据,c#,asp.net-mvc-3,caching,C#,Asp.net Mvc 3,Caching,我有一个ASP.NET MVC 3应用程序,它基本上只是一组web服务。这些web服务由一组控制器操作公开。每个控制器操作都查询我的数据库。因为我的数据很少更改,而且不需要担心过时的数据,所以我想我应该实现一些缓存来提高性能。我的目标是: 从不缓存对用户的响应 将数据库记录缓存最多24小时。如果24小时过去了,请再次访问数据库 这有意义吗?我知道如何防止缓存响应。我只使用以下方法: HttpContext.Response.Cache.SetCacheability(cacheability)
HttpContext.Response.Cache.SetCacheability(cacheability)
但是,我不确定如何将数据库记录缓存在内存中长达24小时。有人对此有什么建议吗?我甚至不知道去哪里找
谢谢这是一篇很好的文章,讨论了ASP.NET MVC 3和缓存的几种与性能相关的实践。MVC框架与持久性无关。没有存储数据的内置方法,因此没有缓存存储数据的内置方法
OutputCache
属性可用于缓存服务器响应。但你明确表示那不是你想做的事
但是,如果您想留在MVC框架内,您仍然可以使用内置的OutputCache
。考虑将数据缓存为JSON结果
[OutputCache(Duration = 86400)]
public JsonResult GetMyData() {
var results = QueryResults();
return Json(results);
}
位于/ControllerName/GetMyData
的JSON字符串将被缓存24小时,因此实际的查询每天只运行一次。这意味着您必须在最后一页上实现一个AJAX调用,或者从服务器上进行另一个HTTP调用。这两个都不理想
我会在MVC框架之外寻找另一种解决方案。考虑一下,它是为这个目的而创建的。 如果你使用MSSQL,你可能想看。
我不确定您是否可以将缓存过期时间配置为24小时,但使用缓存依赖项,您可能不需要这样做-一旦数据库更新,它将使缓存失效(即,应该比时间过期策略更有效)。您所说的不完全是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;
}
}
}
字符串数据
在此处显示实际数据。添加此类后,将GetData()
方法替换为DataCacher.Data
希望它能帮助您,或者至少能引导您进一步思考。您可以使用
System.Runtime.Caching
命名空间(或者ASP.NET缓存,但它比较旧,只能在web应用程序中使用)
下面是一个示例函数,您可以使用它来概括当前的数据检索机制。您可以更改MemoryCache.Add中的参数以控制其缓存量,但您要求24小时以上
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;
}
使用System.Runtime.Caching;//排在第一位
公共IEnumerable GetData()
{
IEnumerable data=MemoryCache.Default.Get(MYCACHEKEY)作为IEnumerable;
如果(数据==null)
{
data=//实际从这里的数据库获取数据
MemoryCache.Default.Add(MYCACHEKEY,data,DateTimeOffset.Now.AddHours(24));
}
返回数据;
}
正如@Bond所提到的,如果要缓存的数据可能在24小时内发生更改,您可能还希望使用SQL缓存依赖项。如果是非常静态的,这将满足您的要求。您只是想将表的全部内容缓存到内存中,还是想使用LRU缓存缓存部分内容?听起来您并不是在寻找MVC框架提供的解决方案。MVC框架旨在为用户创建响应,并可以使用内置的OutputCache属性缓存这些响应。由于您不希望缓存响应,因此可能需要寻找一种更抽象的缓存查询结果的方法,该方法与MVC框架(memcached等)无关。实际上,在我的Instance中,我的表已经转换为CLR对象。所以,理想情况下,我只想缓存对象。@user70192——对。我认为MVC不是完成这项任务的合适工具。看到我的答案了。由于大部分时间都停留在.NET3.5上,我还没有听说过这个。它看起来很好--有点像一个开箱即用的memcached。它可以跨多台机器分发吗?它不是跨多台机器,它只是一个内存中的解决方案。它与ASP.NET缓存(
System.Web.Caching
)完全相同,但也可用于非ASP.NET应用程序。