在ASP.NET MVC 3中缓存数据

我有一个ASP.NET MVC 3应用程序,基本上只是一组Web服务。 这些Web服务由一组Controller操作公开。 每个控制器操作都会查询我的数 因为我的数据很少改变,并且陈旧的数据不是一个问题,我想我会实现一些缓存来提高性能。 我的目标是:

  1. 永远不要缓存对用户的响应。
  2. 将数据库记录缓存最多24小时。 如果已经过了24小时,请再次点击数据库。

那有意义吗? 我知道如何防止缓存响应。 我只使用以下内容:

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 GetData() { IEnumerable data = MemoryCache.Default.Get(MYCACHEKEY) as IEnumerable; 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的几个与性能相关的实践,并提到了缓存。