【问题标题】:Caching Data in ASP.NET MVC 3在 ASP.NET MVC 3 中缓存数据
【发布时间】:2012-06-17 12:46:21
【问题描述】:

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

  1. 从不缓存对用户的响应。
  2. 将数据库记录缓存长达 24 小时。如果 24 小时过去了,请再次访问数据库。

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

HttpContext.Response.Cache.SetCacheability(cacheability)

但是,我不确定如何将我的数据库记录缓存在内存中长达 24 小时。有人对如何做到这一点有任何建议吗?我什至不知道在哪里看。

谢谢

【问题讨论】:

  • 您只是想将表的全部内容缓存到内存中,还是想使用 LRU 缓存来缓存一部分?
  • 这听起来不像是在寻找 MVC 框架提供的解决方案。 MVC 框架旨在为用户创建响应,并且可以使用内置的 OutputCache 属性缓存这些响应。由于您不希望缓存响应,因此您可能需要寻找一种更抽象的方法来缓存查询结果,该方法不依赖于 MVC 框架(memcached 等)。
  • 我想将一个表的全部内容缓存到内存中。实际上,在我的实例中,我的表已经转换为 CLR 对象。所以,理想情况下,我只想缓存对象。
  • @user70192 -- 对。我不认为 MVC 是该任务的正确工具。看我的回答。

标签: c# asp.net-mvc-3 caching


【解决方案1】:

您可以使用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;
}

正如@Bond 所提到的,如果您正在缓存的数据可能在 24 小时内发生变化,您可能还希望考虑使用 SQL 缓存依赖项。如果它是相当静态的,这将按照您的要求进行。

【讨论】:

  • 大部分时间都停留在 .NET 3.5 上,我没听说过这个。它看起来不错——有点像开箱即用的 memcached。它可以分布在多台机器上吗?
  • 它不是跨多台机器,它只是一个内存解决方案。它与 ASP.NET 缓存 (System.Web.Caching) 完全相同,但也可用于非 ASP.NET 应用程序。
【解决方案2】:

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,它正是为此目的而创建的。

【讨论】:

    【解决方案3】:

    您所说的并不完全是 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 在此处显示您的实际数据。添加此类后,将您的 GetData() 方法替换为 DataCacher.Data

    希望它对您有所帮助或至少能引导您进行进一步的思考。

    【讨论】:

      【解决方案4】:

      如果您使用的是 MSSQL,您可能需要查看 SQL Cache Dependency

      我不确定您是否可以将缓存过期时间配置为 24 小时,但您可能不需要缓存依赖项 - 只要数据库有更新,它就会使缓存失效(即应该比时间到期策略)。

      【讨论】:

        【解决方案5】:

        Here 是一篇很好的文章,它讨论了 ASP.NET MVC 3 的几种性能相关实践,并提到了缓存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-25
          • 1970-01-01
          相关资源
          最近更新 更多